我已经看到以下链接并回答但我感到困惑....
var color = "black";
var r = function (x, y) {
if(y == 1){
var color = "red"; //refers to local color, here color points to red color in memory
} else {
console.log('inside else block');
color = "red color";//refers to global color, here color points to red color in memory
}
//var color = "red color"; //refers to local color, here color points to red color in memory
//color = "red";//refers to global color, here color points to red color in memory
if (x > 2 ){
return x*2;
} else {
return x * x;
}
}
r(5, 2);
console.log(color);
但输出是black
而不是我期望的red color
....因为在else
块内部它指的是全局变量吗?
没有if
块,我得到red
,正如预期的那样(见下面的代码)....
如果它是only function
范围,那么上述情景中的值如何变化?
var color = "black";
var r = function (x, y) {
//var color = "red color"; //refers to local color, here color points to red color in memory
color = "red";//refers to global color, here color points to red color in memory
if (x > 2 ){
return x*2;
} else {
return x * x;
}
}
r(5, 2);
console.log(color);
来自msdn,
JavaScript不支持块作用域(其中一组大括号{...}定义了一个新作用域),除了块作用域变量的特殊情况
答案 0 :(得分:2)
但输出是黑色而不是我预期的红色......因为在else块中它指的是全局变量吗?
没有。 var
在当前函数的范围内声明变量,而不是块,并且悬挂因此在您放置的函数中的位置无关紧要它
您无法有条件地应用var
。
答案 1 :(得分:2)
当你宣布color =" red"与' var'关键字,这将创建一个新变量' color'仅在该范围(函数r)中,它将仅覆盖该范围(函数r)中的变量颜色。
调用console.log(在全局或窗口范围内)时,请引用该范围内var关键字声明的变量颜色。
" ...因为在else块中它指的是全局变量对吗?"
不,所有变量都在函数start上初始化(提升)。所以这里你也指的是相同的变色。
简单的规则使用' var'定义一个新变量(覆盖外部作用域) 在一个范围内,并假设你所有的' var'语句声明(不是赋值)被移动到函数的开头(范围)。
即。你的代码相当于:
window.color = "black"; // assuming this is inside <script> tag directly
var r = function (x, y) {
var color; // it is your local 'color'
if(y == 1){
color = "red"; //refers to local color, here color points to red color in memory "YES"
} else {
console.log('inside else block');
color = "red color";//NOT refers to global color, here color points to red color in memory
}
if (x > 2 ){
return x*2;
} else {
return x * x;
}
}
r(5, 2);
console.log(window.color); // the window scope.
你假设它是java方式 - {}包含一个范围。 对于javascript:function(){}包含一个范围。不是&#34;如果&#34; 并且每个范围都可以访问外部范围中的变量。
答案 2 :(得分:1)
但输出是黑色而不是红色
这是因为在块内部(在函数内部)color
被分配了一个值为red color
的新引用,一旦封闭函数的范围结束,就会收集垃圾。
Javascript变量是功能范围的,function
内分配的新引用仅在function
范围内持续有效。
在函数外部,保留了较旧的引用及其值black
。
<强>更新强>
根据你的评论,
它进入else块然后我不使用var而只是颜色 所以它应该引用全局颜色吧?
不,变量在函数开始执行之前被提升,因此if
条件是否被执行并不重要。