this call apply 完全理解
this
this 是 JavaScript 的关键字,在函数体内部使用,其具体的指向由函数运行时的环境决定。
function Foo(){
this.x = 1;
}
函数的具体指向根据调用情况可以分为四种情况:
1,单纯的函数调用
这是最简单的,在这种情况下,this
指向全局对象。
例子1:
var a = 123;
function foo(){
console.log(this.a);
}
foo(); // 123
不属于任何函数的变量,或者在全局中定义的变量就是全局变量。上面代码中 a
就是全局变量。执行函数后,this
指向全局对象 window
。所以 this.a
就是 window.a
。
2,作为对象的方法调用
在作为对象的方法调用时,this
指向调用它的对象。谁调用包含 this
的函数,this
就指向谁。
例子2:
var obj = {
x: 56,
m: function(){
console.log(this.x);
}
};
obj.m(); // 56
在这个例子中,m
函数作为 obj
的方法被 obj
对象调用,所以 this
就指向 obj
。
3,作为构造函数调用
例子3:
function foo(){
this.x = 34;
}
var age = new foo();
console.log(age.x); // 34
可以通过构造函数 new
一个对象,this
就是指向新new出来的对象。
4,call和apply的调用
call
和 apply
用法是一样的,只是传递参数时有些许区别。这里以 call
举例说明,
例子4:
var x = 123;
var obj = {
x: 567,
m: function(){
console.log(this.x);
}
};
obj.m(); // 567
obj.m.call(window); // 123 => 就是把this值指向winodw
call
接受一组参数,第一个参数就是要指向的对象。后面的参数是要传入的值。
但是这还不是关于 this
的全部。要完全理解 this
前,需要先理解这句话。
this 永远指向最后调用它的对象
我们再来看一个例子。
例子5
var obj = {
x: 56,
m: function(){
console.log(this.x); // console.log(this === window); => true
}
};
f = obj.m; // 如果我这么调用会显示什么?
f(); // ??
你可以先在浏览的终端中运行一下,结果是否与你想的一样。如果一样,说明你理解了上面这句话。如果不一样,则说明你对上面这句话的理解有误差。例子5的结果是 undefined
。为什么会这样?
再来看一下这就话,this 永远指向最后调用它的对象 (重要的话重复三遍)。
f = obj.m
这句代码把 m
方法赋值给了 f
。最后 f
执行的函数。 f()
直接执行了函数,这就相当于在全局环境中执行的。所以 this
指向了全局对象 window
。而全局对象中没有变量 x
,所以显示 undefined
。
我们可以把代码中的 console.log(this.x)
换为 console.log(this === window)
。再执行一下代码,会输出为 true
。说明我们是对的。
call apply
语法:func.apply(thisArg,[argsArray])