0

在“JavaScript:权威指南,第 6 版”一书中,第 61 页,第 4.5 节调用表达式,它说 -

在方法调用中,作为属性访问对象的对象或数组在函数执行时成为参数的this

有人可以用简单的英语解释该语句的含义,并举个例子吗?我特别不知道“属性访问的主题”是什么意思。

非常感谢!

4

3 回答 3

1

在 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

在上面,thisbaris not foo的调用中,它是全局对象(如果你不是在严格模式下)或undefined(如果你是)。

更多(在我的博客上):

于 2013-02-02T10:52:30.307 回答
0

为了补充 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指的是已调用该函数的对象。

于 2013-02-02T11:02:08.993 回答
0

我对“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。

于 2013-02-02T11:19:59.757 回答