最近在看《你不知道的JavaScript》,其中关于this的指向的改变有隐式绑定、显式绑定、new绑定三种,显示绑定和new绑定两种的优先级这块儿没看懂。。。有大佬能指教一下吗?
关于this指向
javascript
120 views
最近在看《你不知道的JavaScript》,其中关于this的指向的改变有隐式绑定、显式绑定、new绑定三种,显示绑定和new绑定两种的优先级这块儿没看懂。。。有大佬能指教一下吗?
函数调用时无任何调用前缀的情景,指向全局,在严格模式环境中,默认绑定的this指向undefined,如:
function fn() {
console.log(this); //window
console.log(this.str);
};
function fn1() {
"use strict";
console.log(this); //undefined
console.log(this.str);
};
如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上,比如
function fn() {
console.log(this.str);
};
let obj = {
str: 'hackertalk',
func: fn
};
obj.func() // hackertalk
如果函数调用前存在多个对象,this指向距离调用自己最近的对象。
通过call、apply以及bind方法改变this的行为,指向参数提供的是null或者undefined,那么 this 将指向全局对象
let str = 'hackertalk';
fn.call(undefined); // hackertalk
fn.apply(null); // hackertalk
fn.bind(undefined)(); // hackertalk
通过 new 关键字构造的新对象,this 指向新对象本身
function Fn(){
this.str = 'hackertalk';
};
let obj = new Fn();
obj.str // hackertalk
显式绑定 > 隐式绑定 > 默认绑定
new绑定 > 隐式绑定 > 默认绑定
因为 new 和显示绑定不会同时发送,所有没有这两者的比较,比如:
let obj2 = new Fn().call(obj1);
这样写会报错: call is not a function