Name = 'window data';
document.Name = 'current document data';
(function(window, document) {
var Name = 'local data';
var myObj = {
Name: 'object data',
f: function() {
alert(this.Name);
}
};
myObj.newFun = function() {
alert("Local scope " + Name + "\nObject Scope : " + this.Name);
}
function testFun() {
alert("Window Scope : " + window.Name +
"\nLocal Scope : " + Name +
"\nObject Scope : " + this.Name +
"\nCurrent document Scope : " + document.Name
);
}
myObj.newFun();
//testFun(); // Promts see "Object Scope : window data", but suppose to be "Object Scope : local data"
// did not found the answer
testFun.call(myObj);
testFun.bind({
Name: "name injected"
})();
})(window, document);
我试图在自执行匿名块中调用testFun()时发现了一个奇怪的行为。我在代码中添加了一条评论,其中包含实际发生的情况以及我的预期。
任何人都可以解释为什么会这样吗?
答案 0 :(得分:0)
testFun
的上下文为window
,因此行为完全正常(调用testFun()
将在window
的上下文中运行它)。您在下面的行testFun.call(myObj)
将产生所需的行为(call
使用第一个参数作为上下文调用函数,或this
)。
请记住,您正处于自执行匿名块(或立即函数)的闭包中,这与上下文不同。任何未绑定为对象方法的函数的上下文始终为window
,无论它是否为闭包。然而,它是关闭的,无论函数声明在哪里,所以如果你要在你的函数结束时返回函数并将其分配给外部的变量,alert(Name)
将显示local data
而不是{{ 1}},因为testFun是在window data
等于Name
的闭包中声明的。
进一步澄清:
local data