this指向

159 阅读2分钟

学习目标:

掌握this指向

学习资料

《前端开发核心知识进阶》

this指向规律

  • 在函数体中,非显式或隐式地简单调用函数时,严格模式下函数体内this指向undefined,非严格模式指向全局对象window/global
  • new 构造函数,构造函数内this指向新对象
  • 通过call/apply/bind显式调用函数时,函数体内this指向指定的参数对象
  • 通过上下文对象调用函数时,函数体内this指向该对象
  • 尖头函数中this指向由外层作用域决定

具体分析

全局环境中的this

image.png 函数在全局环境中被简单调用,非严格模式下指向全局对象window/global,严格模式指向undefined。

image.png fn 是对象foo中的方法,赋值给fn1,fn1在全局环境中执行,以上代码还是会输出全局对象和undefined。

调用方式改为对象调用:

image.png this指向最后调用他的对象。

执行函数,不考虑显式绑定(call/apply/bind),如果函数中this被上一级对象调用,this指向上一级对象,否则指向全局环境

上下文对象调用中的this

image.png

image.png

this指向最后调用他的对象。

通过bind、call、apply改变this指向

区别:

call、apply直接调用,bind返回一个新函数并不立即执行;

call 接受多个参数,bind接受多个参数,apply接受两个参数 要指向的对象,一个数组形式的参数;

image.png

构造函数和this

image.png

new操作符调用构造函数时具体做了什么?(简略版)

  • 创建一个新对象
  • 将构造函数的this指向新对象
  • 为这个对象添加属性 方法 原型链
  • 返回新对象

用代码表述:

var obj = {}
obj.__proto__ = Foo.prototype
Foo.call(obj)

构造函数如果显式返回一个复杂类型,this指向这个复杂类型,否则(返回的不是对象类型)指向新创建的实例。

箭头函数的this

箭头函数中的this指向是由其所属函数或全局作用域决定的。

image.png

改为箭头函数,this指向foo对象。

image.png

this优先级

显式绑定:call、apply、bind、new

隐式绑定:根据调用关系确定this指向

image.png call、apply、bind 显式绑定 优先级更高。

image.png new修改了bind绑定的this指向 ,new的优先级比显式bind更高。

image.png 箭头函数的this指向所属作用域的this,无法被修改。

image.png

image.png

const声明的变量不会挂载到window对象。