javascript变量范围让我困惑

时间:2016-10-08 10:42:46

标签: javascript

我已经看到以下链接并回答但我感到困惑....

javsacript variable scopes

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不支持块作用域(其中一组大括号{...}定义了一个新作用域),除了块作用域变量的特殊情况

3 个答案:

答案 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条件是否被执行并不重要。