this
似乎没有人提到invoking object
.
window.sayHi=function(){
console.log(this.name);
}
window.name="Window"
window.sayHi();//=Window
var obj={
name:"obj"
}
obj.fn=window.sayHi;
obj.fn();//=obj
上面的代码表明,当在this
上下文中传递函数时会发生变化。如果你不想这样,那么你可以传递一个闭包而不是函数或使用call,apply或bind:
//closure example
obj.fn=(function(w){//w is available because the returned function is a closure
return function(){
w.sayHi();
}
}(window));
obj.fn();//=Window
//using call
obj.fn.call(window);//=Window
//using apply
obj.fn.apply(window);//=Window
//using bind
var boundFn=obj.fn.bind(window);
boundFn();//=Window
那是当您将函数作为参数传递给另一个对象时。当您使用构造函数时this
,函数体内将引用要创建的对象。
但是当你传递它的功能时,它可能不是:
var obj={
name:"obj"
}
var Test=function(){
this.name="Test";
}
Test.prototype.sayHi=function(){
console.log(this.name);
};
var t=new Test();
obj.fn=t.sayHi
t.sayHi();//=Test
obj.fn();//=obj
这是大多数人在将对象实例函数传递给 setTimeout 或事件处理程序时陷入的陷阱:
someButton.onclick=t.sayHi;//when button is clicked this will be the button clicked
setTimeout(t.sayHi,100);//when sayHi is executed 'this' will be window
回答关于构造函数体内存在的 obj1 的问题;我会说不(至少不在 Firefox 中)。我没有规范的链接,但 obj1 将this
在构造函数返回时设置为:
//clean up window.t
delete window.t;
var Test=function(){
this.name="Test";
console.log("and window.t is:",window.t);//undefined
}
Test.prototype.sayHi=function(){
console.log(this.name);
};
window.t=new Test();
更多关于构造函数、原型、继承、覆盖和调用 super的信息。