学习目标:
掌握this指向
学习资料
《前端开发核心知识进阶》
this指向规律
- 在函数体中,非显式或隐式地简单调用函数时,严格模式下函数体内this指向undefined,非严格模式指向全局对象window/global
- new 构造函数,构造函数内this指向新对象
- 通过call/apply/bind显式调用函数时,函数体内this指向指定的参数对象
- 通过上下文对象调用函数时,函数体内this指向该对象
- 尖头函数中this指向由外层作用域决定
具体分析
全局环境中的this
函数在全局环境中被简单调用,非严格模式下指向全局对象window/global,严格模式指向undefined。
fn 是对象foo中的方法,赋值给fn1,fn1在全局环境中执行,以上代码还是会输出全局对象和undefined。
调用方式改为对象调用:
this指向最后调用他的对象。
执行函数,不考虑显式绑定(call/apply/bind),如果函数中this被上一级对象调用,this指向上一级对象,否则指向全局环境
上下文对象调用中的this
this指向最后调用他的对象。
通过bind、call、apply改变this指向
区别:
call、apply直接调用,bind返回一个新函数并不立即执行;
call 接受多个参数,bind接受多个参数,apply接受两个参数 要指向的对象,一个数组形式的参数;
构造函数和this
new操作符调用构造函数时具体做了什么?(简略版)
- 创建一个新对象
- 将构造函数的this指向新对象
- 为这个对象添加属性 方法 原型链
- 返回新对象
用代码表述:
var obj = {}
obj.__proto__ = Foo.prototype
Foo.call(obj)
构造函数如果显式返回一个复杂类型,this指向这个复杂类型,否则(返回的不是对象类型)指向新创建的实例。
箭头函数的this
箭头函数中的this指向是由其所属函数或全局作用域决定的。
改为箭头函数,this指向foo对象。
this优先级
显式绑定:call、apply、bind、new
隐式绑定:根据调用关系确定this指向
call、apply、bind 显式绑定 优先级更高。
new修改了bind绑定的this指向 ,new的优先级比显式bind更高。
箭头函数的this指向所属作用域的this,无法被修改。
const声明的变量不会挂载到window对象。