有人可以解释以下代码的范围绑定吗
window.name = "window";
object = {
name: "object",
method: function() {
nestedMethod: function() {
console.log(this.name);
}
nestedMethod();
}
}
object.method(); // print 'window'
我认为我的问题更多是关于this
...为什么this
会失去范围并默认为全球范围?我们创建的所有匿名函数都将在全局范围内进行吗?
答案 0 :(得分:3)
无论何时调用函数,只需编写func()
,函数内的this
将指向全局对象。在你的情况下,你写:
nestedMethod();
因此this
内的nestedMethod
是窗口对象。您可以使用call
(或apply
)为函数调用手动定义上下文:
nestedMethod.call(this);
答案 1 :(得分:2)
window.name = "window";
object = {
name: "object",
method: function () {
var self = this;
var nestedMethod = function () {
console.log(self.name); // or object.name without declaring self
}
nestedMethod();
}
}
object.method(); // print 'object'
保存对象的范围 - 或使用对象本身!
我们创建的所有匿名函数都将在全局范围内进行吗?
不,并非所有匿名函数都会失去其范围,所有函数范围都绑定到全局对象(如果未使用特定{{1}调用它们},请参阅this
和apply
,请参阅下面的示例!)
call
答案 2 :(得分:2)
任何函数都是这样调用的:
someFunction();
将全局范围作为this
的值(在非严格模式下)。您可以将外部范围存储在局部变量中,或者使用.call()
或.apply()
:
nestedMethod.call(this);
答案 3 :(得分:0)
你应该像这样声明嵌套函数:
Super.prototype.someFunc = function() {
this.nestedFunc = function() {}
//now call it
this.nestedFunc()
}