javascript变量范围让我感到困惑

javascript变量范围让我感到困惑,javascript,Javascript,我看到了下面的链接和答案,但我很困惑 但是输出是黑色而不是我所期望的红色。因为在else块中,它引用的是全局变量,对吗 如果没有if块,我会得到红色,正如预期的那样(参见下面的代码)。。。。 如果它是唯一的功能范围,那么在上述场景中该值是如何变化的 var color = "black"; var r = function (x, y) { //var color = "red color"; //refers to local color, here color points to

我看到了下面的链接和答案,但我很困惑

但是输出是
黑色
而不是我所期望的
红色
。因为在
else
块中,它引用的是全局变量,对吗

如果没有
if
块,我会得到
红色
,正如预期的那样(参见下面的代码)。。。。 如果它是
唯一的功能
范围,那么在上述场景中该值是如何变化的

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

但是输出是黑色而不是红色

这是因为在块内部(函数内部)
color
被分配了一个新的引用,其值为
red color
,该引用在封闭函数的作用域结束时立即被垃圾回收

Javascript变量是函数作用域,在
函数
中分配的新引用仅在
函数
的作用域持续之前相关

在函数外部,保留了较旧的引用及其值
黑色

更新

根据你的评论,

它进入else块,然后我不使用var,只使用颜色 所以它应该指的是全局颜色,对吗

否,变量在函数开始执行之前被提升,因此无论是否执行了
条件

但是输出是黑色而不是红色

这是因为在块内部(函数内部)
color
被分配了一个新的引用,其值为
red color
,该引用在封闭函数的作用域结束时立即被垃圾回收

Javascript变量是函数作用域,在
函数
中分配的新引用仅在
函数
的作用域持续之前相关

在函数外部,保留了较旧的引用及其值
黑色

更新

根据你的评论,

它进入else块,然后我不使用var,只使用颜色 所以它应该指的是全局颜色,对吗

否,变量在函数开始执行之前被提升,因此无论是否执行了
条件

但是输出是黑色,而不是我预期的红色…因为在else块中,它是指全局变量,对吗

否。
var
在当前函数的范围内声明一个变量,而不是块,并且它是提升的,因此将它放在函数的何处并不重要

您不能有条件地应用
var

但是输出是黑色,而不是我预期的红色…因为在else块中,它是指全局变量,对吗

否。
var
在当前函数的范围内声明一个变量,而不是块,并且它是提升的,因此将它放在函数的何处并不重要

您不能有条件地应用
var

当您使用'var'关键字声明color=“red”时,这将仅在该范围(函数r)中创建一个新变量'color',该变量将仅覆盖该范围(函数r)中的变量color

当您调用console.log(在全局或窗口范围内)时,您将引用该范围内由var关键字声明的变量颜色

“…因为在else块内部,它引用的是全局变量,对吗?”

否,所有变量都在函数启动时初始化(提升)。所以这里也指的是相同的颜色变量

简单规则使用“var”定义新变量(覆盖外部范围) 在一个作用域中,并假设所有“var”语句声明(而不是赋值)都移动到函数(作用域)的开头

i、 e.您的代码相当于:

 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.
window.color=“黑色”//假设这是直接在标签内
var r=函数(x,y){
var color;//它是您的本地“颜色”
如果(y==1){
color=“red”//表示本地颜色,这里的颜色指向内存中的红色“YES”
}否则{
console.log('inside else block');
color=“red color”//不表示全局颜色,这里的颜色表示内存中的红色
}
如果(x>2){
返回x*2;
}否则{
返回x*x;
}
}
r(5,2);
console.log(window.color);//窗口范围。
您假设它是java方式-{}封闭一个作用域。 对于javascript:function(){}包含一个作用域。不是“如果” 并且每个作用域都可以访问外部作用域中的变量。

当您使用'var'关键字声明color=“red”时,这将仅在该作用域(函数r)中创建一个新变量'color',该变量将仅覆盖该作用域(函数r)中的变量color

当您调用console.log(在全局或窗口范围内)时,您将引用该范围内由var关键字声明的变量颜色

“…因为在else块内部,它引用的是全局变量,对吗?”

否,所有变量都在函数启动时初始化(提升)。所以这里也指的是相同的颜色变量

简单规则使用“var”定义新变量(覆盖外部范围) 在一个作用域中,并假设所有“var”语句声明(而不是赋值)都移动到函数(作用域)的开头

i、 e.您的代码相当于:

 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.
window.color=“黑色”//假设这是直接在标签内
var r=函数(x,y){
var color;//它是您的本地“颜色”
如果(y==1){
color=“red”//表示本地颜色,这里的颜色指向内存中的红色“YES”
}否则{
console.log('inside else block');
color=“red color”//不表示全局颜色,这里的颜色表示红色