我是js的初学者,我对以下代码感到困惑:
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:bar”,但得到了“当前的arg:undefined”。我注意到,首先将this.arg复制到“普通”变量中,并在闭包中引用此变量:
Foo.prototype = {
init: function () {
var yo = this.arg;
var f = function () {
alert("current arg: " + yo); }
f();
}
};
我做错了什么,错误的期望,还是属于js WTF?
答案 0 :(得分:4)
Vanilla函数将在this
引用window
的情况下运行。您的第二段代码是如何使用闭包解决此问题的完美示例。
(您还可以使用call
和apply
来调用具有特定上下文的函数。)
答案 1 :(得分: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
实际上是“构造函数”的唯一方法是调用样式(即每当你调用它时使用关键字new
)