你不知道的js上篇
-
关于this
- 为什么要用this,显式传递上下文对象会让代码变得越来越混乱,使用this更优雅的隐式传递一个对象的引用
- 误解指向自身和函数作用域,this既不是指向函数自身,也不指向函数的词法作用域,实际上是在函数被调用的时发生的绑定,它指向什么完全取决于函数在哪里被调用
-
this全面解析
- 熟悉调用位置,浏览器的调试工具,打断点,了解调用栈的调用位置,或者使用代码"debugger" ('堆',先进先出,‘栈’,后进先出)
- 如果要判断一个运行中的函数的t就this绑定,就需要找到这个函数的直接调用位置,找到之后就可以优先级顺序来判断this的绑定对象
- new绑定,由new调用?绑定到新创建的对象
- 显式绑定,由call或者apply(或者bind)调用?绑定到指定的对象
- 隐式绑定,由上下文对象调用?绑定到那个上下文对象
- 默认绑定,在严格模式下绑定到undefined,否则绑定到全局对象
- 一定要注意,有些调用可能在无意中使用默认绑定规则,如果想“更安全”地忽略this地绑定,你可以使用一个DMZ(空对象),比如0 = Object.create(null),以保护全局对象
- ES6中的箭头函数并不会使用上面的四条规则,而是根据当前的词法作用域来决定this,具体会继承外层函数调用的this绑定,相当于ES6中的self = this;的机制