Javascript嵌套函数丢失范围

时间:2013-07-09 21:32:05

标签: javascript binding scope

有人可以解释以下代码的范围绑定吗

window.name = "window";

object = {
       name: "object",
       method: function() {
             nestedMethod: function() {
                   console.log(this.name);
             }
             nestedMethod();
       }
}

object.method();  // print 'window'

我认为我的问题更多是关于this ...为什么this会失去范围并默认为全球范围?我们创建的所有匿名函数都将在全局范围内进行吗?

4 个答案:

答案 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}调用它们},请参阅thisapply,请参阅下面的示例!)

call

答案 2 :(得分:2)

任何函数都是这样调用的:

someFunction();

将全局范围作为this的值(在非严格模式下)。您可以将外部范围存储在局部变量中,或者使用.call().apply()

  nestedMethod.call(this);

答案 3 :(得分:0)

你应该像这样声明嵌套函数:

Super.prototype.someFunc = function() {
  this.nestedFunc = function() {}
  //now call it
  this.nestedFunc()
}