解释“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
的信息。