JavaScript:this是什么?
定义:this是包含它的函数作为方法被调用时所属的对象。
看定义有点懵……
先来看一个题目:
//以下代码输出什么?为什么?
var number = 50;
var obj = {
number: 60,
getNum: function () {
var number = 70;
return this.number;
}
};
console.log(obj.getNum()); //60
console.log(obj.getNum.call()); //<=> obj.getNum.call(window) 输出:50
console.log(obj.getNum.call({number:20})); //20
(1)this -> obj
getNum()被调用,被谁调用?被obj调用,所以this指向的是obj对象,所以此时输出60
(2)this -> window
call方法是什么?它可以用来改变this的指向,同时还有一个apply(),它和call()是一样,区别我们下面再说。
此时this默认绑定在window,所以输出50
(3)this -> {number : 20}
此时this绑定在对象 {number:20} 上,所以输出20
call方法调用示例:
window.color = 'red';
document.color = 'yellow';
var s1 = {color: 'blue' };
function changeColor(){
console.log(this.color);
}
changeColor.call(); //red (默认传递参数)
changeColor.call(window); //red
changeColor.call(document); //yellow
changeColor.call(this); //red
changeColor.call(s1); //blue
call()与apply()的区别:
* 接收参数的方式不同(接收两个参数的时候,第一个参数一样[作用域],第二个参数不同)
call() - 一个个列举出来
apply() - 数组
function fn(c,d){
return this.a + this.b + c + d;
}
var s = {a:1, b:2};
console.log(fn.call(s,3,4)); // 1+2+3+4 = 10
console.log(fn.apply(s,[5,6])); // 1+2+5+6 = 14
总结:
一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。
this绑定有四种情况;
默认绑定:函数独立调用时,this默认绑定到window
隐式绑定:看函数调用栈,上一个的栈点就是this,console.trace()可查看函数的调用关系
显式绑定:如call,apply,bind,this指向绑定对象
new绑定:this指向new出来的对象