name="me";
var tmp= {
name : "My Object",
getNameFunc : function(){
return function(){
alert(this+this.name+" l");
};
}
};
tmp.getNameFunc()()提问 为什么这里的this为什么会是window吗 为什么不是tmp对象 不是应该一级一级的往上找 照理说在getNameFunc : function()是有tmp的this对象存在啊
var tmp= {
name : "My Object",
getNameFunc : function(){
return function(){
alert(this+this.name+" l");
};
}
};
tmp.getNameFunc()()提问 为什么这里的this为什么会是window吗 为什么不是tmp对象 不是应该一级一级的往上找 照理说在getNameFunc : function()是有tmp的this对象存在啊
name="me";
var tmp= {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
alert(that+that.name+" l");
};
}
};
tmp.getNameFunc()()
</script>
function(){
alert(this+this.name+" l");
}这个函数对象返回,不对里面的变量进行解释,返回后你再用()执行返回的值,就相当于直接执行
(function(){
alert(this+this.name+" l");
})()了。
首先,这语句是写在window下的吧。tmp.getNameFunc()返回了一个函数,然后再执行这个返回的函数。相当于在全局作用域下调用了这个返回的函数,this当然是window了好吗。。
如果希望this指向的是tmp,可以像1楼那样做,也可以 name="me";
var tmp= {
name : "My Object",
getNameFunc : function(){
alert(this+this.name+" l");
};
}
mp.getNameFunc();
};
alert(this);2.js是运行时绑定
tmp.getNameFunc()返回的是method的引用。这个时候method并没有绑定在哪个对象上,因为不属于任何对象。所以直接调用tmp.getNameFunc()(),效果等同于直接
(function(){
alert(this+this.name+" l");
})();
this当然指向window了。
另外,下面的代码可以强行将method指定到object。跟java的反射invoke有异曲同工之妙。
tmp.getNameFunc().call(tmp);
我看到你说,这点和面向对象语言很不同。实际上他在设计思想上是完全相同的。
比如java,他也有java.lang.reflect.Method类,他也可以从class中抽取Method。并且这个instance不绑定在任何对象上。只在invoke的时候动态绑定
所以你这句话我理解了 希望是这样!