解释“this”的价值
重要性:3
在下面的代码中,我们打算连续调用 4 次 obj.go() 方法。
但是调用 (1) 和 (2) 的方式与 (3) 和 (4) 不同。为什么?
let obj, method;
obj = {
go: function() { alert(this); }
};
obj.go(); // (1) [object Object]
(obj.go)(); // (2) [object Object]
(method = obj.go)(); // (3) undefined
(obj.go || obj.stop)(); // (4) undefined
以下是解释。
-
这是一个常规的对象方法调用。
-
相同,括号在这里不会改变操作顺序,点运算符始终优先。
-
这里我们有一个更复杂的调用
(expression)()。这个调用就像被分成两行一样工作。f = obj.go; // calculate the expression f(); // call what we have这里
f()作为函数执行,没有this。 -
与
(3)相似,在左括号()的左侧,我们有一个表达式。
为了解释 (3) 和 (4) 的行为,我们需要回顾一下属性访问器(点或方括号)返回的是引用类型的值。
对它的任何操作,除了方法调用(如赋值 = 或 ||),都会将其转换为普通值,它不包含设置 this 的信息。