2010-11-12 47 views
5

“这个”访问我在JS初学者,和我通过下面的代码不解:JavaScript的原型,并在关闭

Foo = function(arg) { 
    this.arg = arg; 
}; 

Foo.prototype = { 
    init: function() { 
     var f = function() { 
      alert("current arg: " + this.arg); // am expecting "bar", got undefined 
     } 
     f(); 
    } 
}; 

var yo = Foo("bar"); 
yo.init(); 

我有望获得“当前ARG:酒吧”,却得到了“当前arg:undefined“。我注意到,复制this.arg成“正常”的可变第一,并在封闭闯民宅此变量的作用:

Foo.prototype = { 
    init: function() { 
     var yo = this.arg; 
     var f = function() { 
      alert("current arg: " + yo);   } 
     f(); 
    } 
}; 

上午我做错了什么,得到了错误的预期,或者它落入的一个js WTF?

+0

复制'this.arg'到一个“正常”变量首先不会做任何不同于'this'对你的函数意味着什么。 – bobobobo 2010-11-12 06:02:36

+0

@bobobobo技术上是真的,但是什么时候有人暗示会发生?你说的话可能会引起误解。在第二个例子中,他实际上并没有使用'this';使用局部变量'yo'创建一个闭包,即使在'f'函数内部也能保持对预期对象的引用。 – theazureshadow 2010-11-12 06:09:32

回答

3

这取决于函数是如何调用。

如果使用关键字new调用,则this引用正在构造的对象(它将在函数结束时隐式返回)。

如果作为普通函数调用,则this引用全局的window对象。

例子:

// Constructor for Foo, 
// (invoke with keyword new!) 
function Foo() 
{ 
    this.name = "Foo" ; 
} 

myFoo = new Foo() ; 
alert('myFoo ' + myFoo.name + '\n' + 'window: ' + window.name) ; // window.name will be empty 

// now if we invoke Foo() WITHOUT keyword NEW 
// then all references to `this` inside the 
// function Foo will be to the 
// __global window object__, i.e. the global window 
// object will get clobbered with new properties it shouldn't 
// have! (.name!) 

Foo() ; // incorrect invokation style! 
alert('myFoo ' + myFoo.name + '\n' + 'window: ' + window.name) ; 

JavaScript没有“构造”本身,只有这样的JavaScript知道你function实际上是“构造”是invokation风格(即您使用关键字new当你调用它)

4

香草功能将运行this参考window。你的第二段代码是如何使用闭包来解决这个问题的完美例子。

(您也可以使用callapply调用函数与特定的上下文。)

+0

啊,这解释了这种行为。谢谢 ! – 2010-11-12 05:51:55

+0

这太糟糕了,downvotes是匿名的。无论谁低估,我会感激评论:) – theazureshadow 2010-11-12 06:10:16