为什么'this'的值会因文档而异

时间:2014-06-20 03:38:34

标签: javascript jquery this

在我从{{1上下文。

this

根据我的理解,window的值是根据其执行上下文确定的。现在当我document函数handler指向期望的document时,但是当我从该上下文调用方法时,为什么我的上下文从{{1}变为$(document).ready(function() { var handler = function() { console.log(this); // this = window } console.log(this); // this = document handler(); }) }}

提前致谢。

4 个答案:

答案 0 :(得分:4)

在函数内部,this的值取决于函数的调用方式。

var handler = function () {
    console.log(this); // this = window
};

在这种情况下,调用不会设置this的值。由于代码不是严格模式,因此它的值必须始终是一个对象,因此它默认为全局对象即窗口。

在全局执行上下文中(在任何函数之外),this引用全局对象,无论是否处于严格模式。

console.log(this); // this = document

答案 1 :(得分:2)

基本上,每当你看到一个简单的函数调用,即“handler()”时,JavaScript就会像你写的一样调用它:

handler.call(null);

这与foo.handler()不同,在这种情况下,它将以:

运行
handler.call(foo);

如果你想在你的功能中看到document,你需要这个:

handler.call(this);

答案 2 :(得分:0)

  

this关键字引用嵌套函数source中的头对象:页面号。这本书的第76页

var myObject = {
 func1: function() {
   console.log(this); // logs myObject
   var func2 = function() {
     console.log(this) // logs window, and will do so from this point on
   var func3 = function() {
     console.log(this); // logs window, as it’s the head object
   }();
   }();
 }
}
myObject.func1();

因此,在你的情况下,处理函数是在ready函数中,其中this引用全局对象即window。

答案 3 :(得分:0)

像这样,上下文将保持不变:

this.handler = function() {
  console.log(this);       // this = document!!!
}
console.log(this);
this.handler();