一、全局的this指向是浏览器的window对象
例如
this === window//true
this.document == window.document//true
this.a = 1;
window.a//返回1
二、一般函数的this
function fun(){
return this;
}
fun() === window//true
function func(){
"use strice"
return this;
}
func() === undefined//true
三、作为对象方法的函数的this
var obj ={
x:1,
y:2,
get z(){
return this.x+this.y;
}
}
//此时的this会指向的是调用它的那个对象,即obj
var obj2={x:1}
function fun(){
return this.x;
}
obj2.f = fun;//把fun方法赋给了obj2.f
obj2.f()//此时同样会返回1;因为obj2作为调用的对象调用了f方法,即fun方法,所以this指向了obj2.
四、对象原型链上的this
var obj ={
z:function(){
return this.x+this.y;
}
}
var obj2 = Object.create(obj);
obj2.x=1;
obj2.y=2;
obj2.z();//返回3
所以不管是对象本身还是原型链上的,当去调用时,这个this还是可以指向obj2这个对象的。
五、构造器中的
function fun(){
this.a=1;//通常这种情况下的this指向的是全局的window
}
fun被当做构造器时
var obj = new fun();
此时new fun()时会创建一个空的this对象,并且这个对象的原型会指向fun.prototype。由于fun没有return,所以默认会把this作为对像返回。所以obj.a=1.
当我们构造函数有返回对象时,则获得的是返回的对象而不是this
例如
function fun(){
this.a=1;
return {a:2};
}
var obj = new fun();
obj.a //返回 2;
五、call/apply/bind
call/apply/bind是用来修改函数执行时的this
例如:
function fun(c,d){
return this.a+this.b+c+d;
}
var obj = {a:1,b:2}
fun.call(obj,3,4);//返回10
上面使用call方法,改变fun中的this指向为obj,并传入参数c、d
apply的用法与call相似,只不过apply的参数传递为数组
如:fun.apply(obj,[3,4])
bind方法只能在IE9+才能使用。它改变this指向后,并返回一个新的对象,新的对象绑定的this不会再因为是什么对象调用它而改变this的指向。举个例子:
function fun (){
return this.a;
}
var g = fun.bind({a:"test"});
var obj = {a:1,f:fun,g:g};
obj.f();//返回1
obj.g();//此时不会因为是obj调用,而把this指向obj,仍然是原来的绑定的对象{a:"test"},所以仍旧返回"test"
当我们想重复调用一个函数,并且实现同样的绑定的时候,用bind会比call/aply高效。
bind有个currying的功能,比方说我们有个方法,在不同环境下的配置不一样,但有些参数是一样的,只有部分参数不一样,这时候,我们可以先绑定其中的局部参数。
例如:
function getConfig(color,size,otherOptions){
console.log(color,size,otherOptions);
}
var defaultConfigs = getConfig.bind(null,'#ff498c','12px');
defaultConfigs("options1");//返回#ff498c 12px options1
defaultConfigs("options2");//#ff498c 12px options2
上面代码我们绑定了默认的前两个配置默认值是”#ff498c”和”12px”,我们要改变的只是第三个参数。
当使用new 构造器的方式的时候,bind会失效。举个例子:
function fun(){
this.a = 1;
return this.b;
}
var g = fun.bind({b:2});
g();//由于改变了this的指向为{b:2},所以返回值为2
var f = new fun();//这里的f的原型会指向fun的prototype属性,即会产生一个空的this对象,这个this的属性a为1。由于底下的return 语句没有值,所以将{a:1}的this作为返回。