这在嵌套函数中如何工作

时间:2015-08-06 04:09:40

标签: javascript

我有以下代码段。

var myObject = {
    foo: "bar",

    func: function() {
        var self = this;
        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
        (function() {
            console.log("inner func:  this.foo = " + this.foo);
            console.log("inner func:  self.foo = " + self.foo);
        }());
    }
};
myObject.func();

具有以下结果。

outer func:  this.foo = bar
outer func:  self.foo = bar
inner func:  this.foo = undefined
inner func:  self.foo = bar

我对此代码段有几个问题。

  1. 将嵌套函数放在外部函数中的想法是什么?这对现实生活代码有什么好处?
  2. 我也在努力使用'this'关键字,我一直认为'this'代表全局上下文,所以我对它在外部函数中的工作原理感到困惑,而不是在内部函数中。

2 个答案:

答案 0 :(得分:2)

你的问题中确实有两个不同的概念:

  1. this keyword。
  2. closures
  3. 尝试在闭包中使用thisknown to confuse many people

      

    将嵌套函数放在外部函数中的想法是什么?这对现实生活代码有什么好处?

    关于闭包的文档非常好。如果您不熟悉闭包,那么要点是它会记住定义函数的环境。

    E.g。 self.foo会返回正确的值。

    应用程序主要是函数式编程/ currying。

    E.g。闭包内的self.foo确实返回正确的值,但您不必将值传递给函数。

      

    我也在努力使用'this'关键字,我一直认为'this'代表全局上下文,所以我对它在外部函数中的工作原理感到困惑,而不是在内部函数中。

    在这个区块内:

       (function() {
            console.log("inner func:  this.foo = " + this.foo);
            console.log("inner func:  self.foo = " + self.foo);
        }());
    

    我们不使用对象方法,而是使用简单的调用。由于您未使用strict模式,因此this默认为全局对象。

    在另一部分:

        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
    

    我们在一个对象方法里面; this是指对象myObject

    exercices

    1. 如果在闭包内使用strict模式会发生什么?
    2. 如果你事先做window.foo = 'window foo';会怎么样?

答案 1 :(得分:0)

也许你可以看到这一点来理解"这个"在javascrpt。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this