3

我想知道为什么在John Resig 的 JavaScript Ninja 的秘密一书中,p。48、据说:

每当调用一个函数时,... 一个名为的隐式参数this 也会传递给该函数。

我有点不解,因为之前,我读到这this实际上是一个关键字。也许这并不重要,除非我们尝试

function f() {
    this = {};
}

f();

那么 Chrome 或 Node.js 都会引发一个错误,即它是分配中的无效左侧。因此,如果this实际上是一个隐式参数,那么该行不应该引发错误吗?所以我想知道这本书是否确实存在这个错误this,而且应该是其他错误?

更新:我还重新检查了 JavaScript:权威指南第 6 版和 ECMA-262,他们都说this是关键字)......

4

4 回答 4

2

这确实是一个隐含的论点,因为如果你写:

var foo = {
    bar: function() {
        console.log(this);  // Will be foo.
    }
};

foo.bar();

this隐式绑定到fooinside bar(),就好像您已明确编写:

foo.bar.call(foo);
于 2013-02-13T07:02:46.080 回答
1
function foo(explicitVar /*, this */ ) {
}

// this will only be defined when foo is called
// default: this == window

// directly invoking a function will bind this to `window`
foo(1 /*, window */) // explicitVar == 1, this == window (inside foo)

var a = {
    fuu: foo
}

// invoking foo ON another object binds this to that object
a.fuu(2 /*, a */) // explicitVar == 2, this == a (inside a.fuu)

// even when you reuse a function that was assigned to another object,
// the this will only be bound when invoking
bar = a.fuu
bar(3 /*, window */) // explicitVar == 3, this == window (inside bar)

从这些示例中您可以看到,为了解释this,您可以将其描述为具有特殊执行语义的魔术关键字,也可以将其解释为隐式参数,因为它仅在某些上下文中调用函数时才被分配。

于 2013-02-13T07:24:06.193 回答
0

实际上,这些是同一概念的两个维度。

关键字 'this' => 供用户识别不应用作函数或变量名称的字符串。

隐式参数 'this' => 这是 javascript 引擎识别该对象的一种方式,而该对象又由您抽象出来,由用户像

  this.name //I don't care about which object. It is taken care of 

而不是让自己迷惑

  obj1.name // or is it, obj2 !!! ?? 

在这里,“照顾”部分成为用户的关键字,以及 javascript 引擎的隐式参数,以便它可以为您提供抽象。

于 2013-02-13T07:30:20.713 回答
0

两者都是!

这是一个隐式参数,因为它不是函数声明的一部分,例如

function foo()
{
    // this === window
}

foo();

然而,由于 JavaScript 的执行方式,它就像任何其他对象引用一样存在foo()

foo.call(window)

但它也是一个关键字,因为它受某些规则的约束,例如无法为其分配值。

于 2013-02-13T07:05:55.387 回答