js的this问题

一、全局的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作为返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值