this指向
1、默认绑定规则
console.log(this === window) //true
console.log({} === {}) //false 对象比较的是引用地址 (指针地址)
函数独立调用
function test(){
console.log(this) //window对象
}
test()
2、隐式绑定规则
谁调用就指向谁
通过对象.XX的方式调用函数,函数内this指向这个对象。
var a = 0
var obj = {
b: 2,
fn:function(){
console.log(this); //this指向obj这个对象,谁调用的指向谁 因为这里是obj调用的fn这个函数
function test(){
console.log(this); // 指向window对象(函数独立调用)
}
test()
(function(){
console.log(this); //指向window对象 (函数独立调用)
})()
//闭包,当函数执行的时候,导致函数被定义,并抛出。
function t() {
console.log(this); //window对象当fn函数执行完成后,会返回test obj.fn()() 等价于 test() 也是函数独立调用,所以指向window对象
}
return t;
}
}
obj.fn()()
只有在函数执行的时候,才决定this指向谁。
隐式丢失
变量赋值
var a = 0;
function fn() {
console.log(this); //window
}
var obj = {
a: 1,
fn: fn,
};
var fn2 = obj.fn; //隐式丢失 obj.fn 赋值给 fn2的时候会造成隐式丢失 所以fn2()还是相当于独立调用 所以指向window
fn2();
参数赋值 【一个对象传参,是浅拷贝】
var a = 0;
function foo() {
console.log(this); //widows
}
function result(fn) { //父函数有能力决定子函数的this指向 父函数result 子函数fn
fn();
}
var obj = {
foo: foo,
};
result(obj.foo); //实参被赋值为形参 (值的拷贝过程 [浅拷贝]) 顾明思议为只拷贝了地址 所以最后 还是相当于调用了foo函数
子函数this指向由父函数的第二个参数来决定, API
var arr = [1, 2, 3];
//当函数为参数的时候,我们又称为他是回调函数
//this指向由父函数的第二个参数来决定
arr.forEach(function (item, index, arr) {
console.log(this); //window
});
arr.sort(function (a, b) {
console.log(this); //window
});
setInterval(function () {
console.log(this); //window
}, 10000);
3、改变this指向三兄弟
传参方式不通
call //call接受的是一个参数列表 xx.call(this指向,1,2,3,4,5) -12345为参数
call: 第一个参数如果不是一个对象,是1。 this会指向1的包装类 【Number对象】 是false,则this会指向Boolean
如果传的是undefined和null 因为undefined和null没有包装类,所以默认采用默认绑定 this指向window
apply //apply接受的是一个数组 xx.apply(this指向,[1,2,3,4,5]) -参数为一个数组
bind //bind会创建一个新的函数 xx.bind会返回一个函数 xx.bind(this指向)(1,2,3,4,5) -12345为参数
4、new
function person() {
this.a = 1;
return {};
}
const p = new person();
console.log(p);
//p为实例化对象
//如果ruturn的是一个对象 则指向那个对象
优先级问题
new > call、apply、bind > 隐式转换 > 默认绑定
还没有评论,来说两句吧...