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

时间:2016-02-19 20:03:53

标签: 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.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

窗口如何成为mp.funct()

的上下文

3 个答案:

答案 0 :(得分:1)

在这个例子中:

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

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

在这个例子中:

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

    }
}

答案 1 :(得分:0)

来自MDN JavaScript Scope

的引用
  

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

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

当您在ft内执行相同操作时,gc = "Inside...";正在更改全局变量gc。因此,当您使用gc时,它实际上是在全局范围内使用那个。

修改

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

答案 2 :(得分:-1)

“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
    }
}