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 取决于你调用它时的上下文。
-
当函数作为对象的方法调用时,this 指向这个对象。
-
当你直接执行它时,this 指向 window。
-
你还可以用
call
,applay
,bind
方法来指定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
。