使用函数内的"this"关键字访问全局属性

Ben*_*jia 3 javascript this

我知道在javascript中,当你"this"在函数中使用关键字时,"this"会根据Quirksmode网站引用该函数的"所有者" .因此,当我们有一个函数并"this"在内部使用它时,则"this"引用全局(窗口)对象.

我对如何"this"工作有点困惑,例如在下面的代码中,"this"然后应该能够解决,x因为x它几乎是全局对象的属性(在本例中是窗口).但this.x在这种情况下警报"undefined"而不是x值.

var x = "Global";

function foo(){
    alert(this.x);   //undefined     
};
foo();
Run Code Online (Sandbox Code Playgroud)

然后我尝试了其他一些事情:

function bar(){
    function foo(){
        alert(this); //[Object DOMWindow]
    };
    foo();
};

bar();
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,那么'this'应该参考bar()第二种情况,因为它是所有者foo(),但为什么它仍然是指全局对象?

有人可以解释关于"this"关键字的正确理论是什么?

Que*_*tin 6

你有错误的结局.值this取决于函数的调用方式,而不是函数的定义方式.

  • 如果你打电话window.foo()(那里foo)this将是window
  • 如果你打电话bar.foo(),然后thisbar(虽然你需要复制foo所以它的属性bar第一)
  • 如果你打电话baz.bar.foo(),然后thisbar(你永远只能得到通过父对象this)
  • 如果你打电话foo.call(bar),然后this也将是barcall让您可以覆盖this
  • 如果你打电话,new foo()那么this将是正在创建的新对象

默认的对象window,因此,如果您只需要调用foo()则是一样的window.foo().

函数定义的范围无关紧要.