JavaScript中的this关键字

this 关键字在 JavaScript 中既常用,功能又强大,但很多时候容易混淆其指向的对象。下面通过两个例子来理解一下 this

看第一个例子:

var style = {
  color: "Window Color"
};
var object = {
  style: {
    color: "Object Color"
  }
};
function sayColor(){
  console.log(this.style.color);
}
//使用.bind() 改变函数 this 指向
varsayObjectColor = sayColor.bind(object);
//调用
sayColor(); //"WindowColor"
sayColor.call(); //"Window Color"
sayColor.apply(); //"Window Color"
sayColor.call(object); //"Object Color"
sayColor.apply(object); //"Object Color"
sayObjectColor(); //"Object Color"

前三次调用时,this指向 window 对象,后三次调用时,this 指向 window.object 对象,其中最后一次通过 .bind() 改变了函数的 this 指向,有关 .bind() 在之后的博客中会进一步探讨。

补充:call() apply()

通过 call() apply() 可以改变函数调用的上下文,两者功能相同,区别仅仅在于接收参数的方式不同:

1. call() 方法第一个参数为函数调用的上下文,其余参数直接传递给函数,传递的参数必须逐个列举;

2. apply() 方法第一个参数为函数调用的上下文,另一个是参数数组,可以是Array的实例,也可以是arguments对象。

再看一个复杂一点的例子:

var name = "WindowName";
var firstObj = {
  name: "First Object Name",
  getName: function() {
    return this.name;
  }
};
var secondObj = {
  name: "Second Object Name",
  getName: function() {
    return function() {
      return this.name;
    };
  }
};
var thirdObj = {
  name: "Third Object Name",
  getName: function() {
    var that = this; //定义that变量,保存this对象
    return function() {
      return that.name; //通过闭包访问
    };
  }
};
//调用
firstObj.getName(); //"First Object Name"
secondObj.getName()(); //"Window Name"
thirdObj.getName()(); //"Third Object Name"

其中,第一次调用时this 指向 firstObj ,因为 fristObj.getName是一个函数,而它通过 firstObj.getName() firstObj 上下文中被调用。

第二次调用时 this指向 window ,因为 secondObj.getName() 是一个函数,而它通过 secondObj.getName()() window 上下文中被调用。

第三次调用时,用到了闭包闭包是指有权访问另一个函数作用域中的变量的函数,在这里通过闭包访问到了 getName 中定义的 that 变量,而该变量中的 this 指向 thirdObj

有关闭包我们放到下一篇博客中去探讨,博客地址:

http://xitongjiagoushi.blog.51cto.com/9975742/1672553

最后,总结成一句话,this 的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的

 

完。


拓展阅读:

JavaScript事件中的this http://www.quirksmode.org/js/this.html

本文出自 “细桶假狗屎” 博客,请务必保留此出处http://xitongjiagoushi.blog.51cto.com/9975742/1670529

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值