首页 > 其他 > 详细

关于this 的一个问题

时间:2015-08-28 16:56:55      阅读:155      评论:0      收藏:0      [点我收藏+]
var name = "the window";

var object = {

name:"my object";
getName:function(){
    return this.name;
}
};

object.getName(); //"my object"
(object.getName)(); //"my object"
(object.getName=object.getName)(); //"the window"

为什么呢?

    • (object.getName)() 与 object.getName() 的等价的,因为 xxx.xxx(成员访问) 的优先级高于xxx(xxx)(函数调用),所以加不加圆括号不影响结果(关于运算符优先级可参考 运算符优先级);

    • (object.getName=object.getName) 是一个赋值表达式,赋值表达式求值结果是右值,所以该表达式的值是getName函数。你可以这么理解:(object.getName=object.getName)() 等价于 var b; (b=object.getName)() 等价于 var b; b=object.getName; b()

    • 严格模式下,(object.getName=object.getName)() 会报错,因为严格模式下,禁止 this 关键字指向全局对象。

函数里的 this 取决于你调用它时的上下文。

  1. 当函数作为对象的方法调用时,this 指向这个对象。

  2. 当你直接执行它时,this 指向 window。

  3. 你还可以用callapplaybind方法来指定this

下面有一段示例帮助你理解:

var say = function () {
  console.log(‘My name is‘, this.name);
};

var jack = {
  name: ‘Jack‘,
  say: say
};

var rose = {
  name: ‘Rose‘,
  say: say
};

jack.say(); // My name is Jack
rose.say(); // My name is Rose

window.name = ‘世界之窗‘;
say(); // My name is 世界之窗

 

题目里的(object.getName=object.getName)();这种写法有意思的地方在于,object.getName=object.getName这个赋值操作的返回结果是下面这个函数体,

function(){
    return this.name;
}

 

所以整个这一句的执行结果等同于

(function(){
    return this.name;
})();

 

结合此答案最前面提到的第 2 点,可知这里的this就指向window

关于this 的一个问题

原文:http://www.cnblogs.com/skylor/p/4766780.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!