当使用' new'创建对象时,为什么用作对象属性而不访问闭包?并立即返回?

时间:2015-12-18 13:11:36

标签: javascript closures javascript-objects

现在我正在调用data()函数,它将创建一个局部变量x并返回与obj函数和new关键字一起创建的对象,该关键字具有属性{{1其值为另一个函数。那么为什么返回fun方法不能访问闭包fun

x

现在我们不是创建新对象,而是放置相同的对象并返回它。 现在它可以访问关闭var obj=function(){ this.fun=function(){ console.log(x); }; }; var data=function(){ var x=5; return new obj(); }; var y=data(); y.fun(); 。为什么?

x

2 个答案:

答案 0 :(得分:3)

闭包的范围取决于创建的功能。

// It has access to any x in this scope
var obj=function(){
    // It has access to any x in this scope
    this.fun=function(){
        // It has access to any x in this scope
        console.log(x);
    };
};

...但你在这里定义了X:

var data=function(){
    // New scope here and none of the earlier code has access to it
    var x=5;
    return new obj();
};

...只有函数表达式或声明在里面的函数你可以访问{匿名函数表达式x

您可以将x作为参数传递给obj

答案 1 :(得分:1)

因为在第二个示例中,函数是在与变量相同的范围内创建的,因此可以访问它。在第一个示例中,定义函数时不存在x。