javascript - 访问外部函数中定义的属性

use*_*769 1 javascript closures

我已经尝试了闭包并发现了意想不到的行为.有人可以解释为什么这段代码会这样工作吗?

function foo() {
    this.a='hello';
    return {
      aaa:function() {
        return a; // this suprises me, how can be here accessed 'a' ?
      }
  }
}

o=foo();
alert(o.aaa()); // prints 'hello' ! , I expected undefined
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么我总是使用var that=this短语,如果可以直接从内部函数访问函数属性.

jsfiddle https://jsfiddle.net/5co6f707/

Pau*_*aul 5

它显示'hello'是因为您没有处于严格模式,因此this全局window对象而不是未定义,并a在为其赋值时成为全局变量this.a.由于它a是一个全局变量,因此无处不在.你可以alert(a);在脚本的最后,它也会显示'hello':https://jsfiddle.net/5co6f707/1/.

它应该不起作用(并且不在严格模式下)并且不应该使用它.如果你打算foo用作构造函数,那么你应该new在调用它时使用该关键字(这会破坏你的代码,但是以一种好的方式).