js中this的问题

function x(){ function z(){console.dir(this)} z();}
z()的this 为啥是window?  它在x里面啊

阅读 3.8k
8 个回答

其他回答的挺好了。
我发下我写的文章吧,相对详细。

面试官问:JS的this指向 总结部分

如果要判断一个运行中函数的this绑定, 就需要找到这个函数的直接调用位置。 找到之后
就可以顺序应用下面这四条规则来判断this的绑定对象。
  1. new调用:绑定到新创建的对象,注意:显示return函数或对象,返回值不是新创建的对象,而是显式返回的函数或对象。
  2. call或者apply( 或者bind) 调用:严格模式下,绑定到指定的第一个参数。非严格模式下,nullundefined,指向全局对象(浏览器中是window),其余值指向被new Object()包装的对象。
  3. 对象上的函数调用:绑定到那个对象。
  4. 普通函数调用: 在严格模式下绑定到undefined,否则绑定到全局对象。

ES6中的箭头函数:不会使用上文的四条标准的绑定规则, 而是根据当前的词法作用域来决定this, 具体来说, 箭头函数会继承外层函数,调用的 this 绑定( 无论 this 绑定到什么),没有外层函数,则是绑定到全局对象(浏览器中是window)。 这其实和ES6之前代码中的self = this机制一样。

DOM事件函数:一般指向绑定事件的DOM元素,但有些情况绑定到全局对象(比如IE6~IE8attachEvent)。

一定要注意,有些调用可能在无意中使用普通函数绑定规则。 如果想“ 更安全” 地忽略this
定, 你可以使用一个对象, 比如ø = Object.create(null), 以保护全局对象。

js 中 this 的问题比较常见。
我一般会这样简单判断:

  • 如果显示绑定,比如 bind、call、apply,就指向绑定的 this
  • 如果是箭头函数,this 指向函数定义时的 this
  • 不满足上面条件的时候,谁调用 this 就指向谁,没有显示调用的可以看作 window 对象调用

在你的示例中,函数 z 可以看作是 window 调用,所以 this 指向 window。

这个和z在哪儿声明没关系,只要你是通过z()调用的,this统一都指向window。

除了箭头函数,this 是在调用时由如何调用决定的,与在哪定义没有关系。

  1. this 绑定的是执行函数的对象,比如 a.z() 就是 aa.b.z() 就是 b
  2. 当没有显式指明对象的时候,this 就是 window

this 只要记住谁调用,上下文就是谁 z 函数的上下文是 window,所以打印this 为 window

箭头函数才会绑定x的作用域,其他的要看bind、call、apply 之类的,如果上述都没有就看是谁调用的

因为你的this没有显式的声明,没有显式声明,默认指windowthis的指向可以参考我以前写的一篇文章:JavaScript之扑朔迷离的this

推荐问题
宣传栏