Javascript 我对以下变量范围的理解是否正确

Javascript 我对以下变量范围的理解是否正确,javascript,Javascript,我目前正在学习Javascript 我提出了以下代码示例 var gc = "From Global"; var mp = { gc : "Inside mp", funct : function(){ console.log( gc); //Calls global instead of local } } var ft = function() { gc = "Inside Function"; this.

我目前正在学习Javascript

我提出了以下代码示例

var gc = "From Global";

var mp = {
    gc    : "Inside mp",
    funct : function(){
        console.log( gc);        //Calls global instead of local
    }
}

var ft = function() {
    gc    = "Inside Function";
    this.funct = function(){
        console.log(gc);       //Calls locally declared variable

    }
}

mp.funct();           //calls gc from global scope      --->A
var inst = new ft();  
inst.funct();         //calls gc from its local scope   --->B
我想知道为什么语句A打印全局变量的值,而语句B打印其局部作用域变量的值。我被告知,这与以下事实有关:语句B创建一个ft实例,其上下文是ft,而语句A上下文是窗口,全局局部窗口的局部变量是gc gloable。对吗?如果是这样的话,那么我很困惑,我的印象是什么

foo.bar() ; //Here foo is the context
m.j;        //Here m is the context
Windows如何成为MDN中引用的
mp.funct()
的上下文

JavaScript有两个作用域:全局和局部。一个变量 在函数定义之外声明的是一个全局变量,其 值在整个程序中是可访问和可修改的。变数 在函数定义中声明的是局部的。它是被创造出来的 每次执行该函数时都会被销毁,并且不能 由函数外部的任何代码访问。JavaScript不支持 块范围(其中一组大括号{…}定义了一个新范围), 块作用域变量的特殊情况除外

在您的代码中,
mp
在全局范围内定义,在函数
ft
之外。调用在
mp
中定义的函数时,成员
funct
将不会“看到”同一对象中的其他成员。它能看到的是
mp
所在的上下文

当您在
ft
中执行相同的操作时,
gc=“inside…”正在更改全局变量
gc
。因此,当您使用
gc
时,它实际上是在全局范围内使用该函数

编辑


感谢@t.niese指出一个错误,
gc
未在本地定义。刚刚修改。

“mp”是一个Javascript对象,“ft”是一个函数。这就是区别

mp.gc和mp.funct是Javascript对象中的“键”,而不是变量。如果您希望mp使用mp.gc,可以执行以下操作:

var mp = {
    gc    : "Inside mp",         // not a variable by itself, only a variable if used as mp.gc
    funct : function(){
        console.log( this.gc);   //Calls "local" now
    }
}
在本例中:

var mp = {
    gc    : "Inside mp",
    funct : function(){
        console.log( gc);        //Calls global instead of local
    }
}
var ft = function() {
    gc    = "Inside Function";
    this.funct = function(){
        console.log(gc);

    }
}
您必须调用
this.gc
,因为对象成员(键值对)不是变量,而是对象的成员

在本例中:

var mp = {
    gc    : "Inside mp",
    funct : function(){
        console.log( gc);        //Calls global instead of local
    }
}
var ft = function() {
    gc    = "Inside Function";
    this.funct = function(){
        console.log(gc);

    }
}
gc
不是对象成员,并重写您设置的全局变量。因此,您可以只记录
gc
并获得预期值

您还可以声明一个局部作用域变量:

var ft = function() {
    var somethingLocal    = "I am local";
    this.funct = function(){
        console.log(somethingLocal); // Calls locally declared variable

    }
}

两个
funct
s都引用相同的全局变量。您只需在
ft()
中更改它的值。在
ft
中,变量
gc
没有在本地定义,它仍然引用全局变量,因为没有
var
gc
绑定到
ft
函数的范围。不知道为什么要投-1票?在我看来,这似乎是一个真正的问题简短的回答:因为这不是一个简单的问题,这只是一个闭包行为。
mp
是一个javascript对象,而不是JSON表示。这不仅是因为
gc
funct
没有双引号,还因为在JavaScript中,JSON始终是字符串。
gc
不是在函数中本地定义的<代码>gc=“内部函数”
将全局
gc
设置为
内部函数“
,因为没有
var
绑定到函数的作用域。
gc
不是局部作用域,而是全局作用域。