在“JavaScript:权威指南,第 6 版”一书中,第 61 页,第 4.5 节调用表达式,它说 -
在方法调用中,作为属性访问对象的对象或数组在函数执行时成为参数的值
this
。
有人可以用简单的英语解释该语句的含义,并举个例子吗?我特别不知道“属性访问的主题”是什么意思。
非常感谢!
在“JavaScript:权威指南,第 6 版”一书中,第 61 页,第 4.5 节调用表达式,它说 -
在方法调用中,作为属性访问对象的对象或数组在函数执行时成为参数的值
this
。
有人可以用简单的英语解释该语句的含义,并举个例子吗?我特别不知道“属性访问的主题”是什么意思。
非常感谢!
在 JavaScript 中(目前),this
取决于函数的调用方式,而不是函数的定义方式。鉴于此,弗拉纳根所说的是:
foo.bar();
...在调用bar
,this
将引用 . 引用的对象foo
。
如果您来自其他一些语言,例如 Java 或 C#,您可能会想,“但肯定this
总是指foo
内部bar
”,但在 JavaScript 中并非如此。例子:
var f = foo.bar; // Get a reference to the function, but not calling it
f(); // Now we call it
在上面,this
在bar
is not foo
的调用中,它是全局对象(如果你不是在严格模式下)或undefined
(如果你是)。
更多(在我的博客上):
为了补充 TJ 的答案,这里有一个例子:
var o = {}; // define an object
o.name = 'foo'; // add an attribute to the object
var f = function() { // define a function
return this.name; // the function uses this internally
}
o.someFunction = f; // add the function to the object
var result = o.someFunction();
现在的值result
是'foo'
因为该函数已在对象 o 上调用,并且在函数内部,this
指的是已调用该函数的对象。
我对“this”的理解是“this”是函数执行期间的上下文。
除非您明确更改“this”,否则默认行为是函数执行期间的上下文是函数调用的上下文。
第一种情况(最简单):
var writeHelloFromThis = function() {
console.log('hello from ' + this);
};
writeHelloFromThis();
--> 输出是“hello from [object Window]”,因为调用的上下文是全局对象,即 Window。
第二种情况:现在我们定义一个对象,并将 writeHelloFromThis 添加到它:
var anObject={};
anObject.writeHelloFromThis = writeHelloFromThis;
现在我们用 anObject 作为 context 调用 writeHelloFromThis :
anObject.writeHelloFromThis();
--> 输出是“hello from [object Object]”:这是函数调用的上下文:在这种情况下是 anObject。
第三种情况,有点棘手:现在我们将 'anObject' 的 writeHelloFromThis 存储到另一个 var 中:
var anObjectsWriteHelloFromThis = anObject.writeHelloFromThis;
anObjectsWriteHelloFromThis 只存储一个函数(=一个引用),而不知道任何关于“anObject”的信息。所以如果我们打电话:
anObjectsWriteHelloFromThis();
输出将是“来自 [object Window] 的 hello”,因为调用的上下文是全局对象,即 Window。
最后一句话:如果这种处理方式对您来说似乎是有限的,那么您是对的:这就是为什么某些 Function 方法:bind、call、apply 允许您更改函数的上下文。
最后一个例子:
writeHelloFromThis.call(anObject);
将输出“来自 [object Object] 的 hello”,而不是 windows,因为这里我们强制 'this' 为 anObject。