0

我是 JavaScript 新手。我在这里有一个简单的问题。

我看到下面的代码片段:

var self = this;
.....
self.push = function () {
    var args = [].concat.apply([], arguments);
    args.forEach(self.write);
    return self;
};

self.write is another function.

q1:为什么设置self = this。

q2:为什么我们不能像 arguments.forEach(self.write) 那样简单地编写 push 函数;

4

2 回答 2

3

q1:为什么设置self = this。

this当内部函数想要在闭包中保留对外部函数的引用时使用它。的值this由函数的调用方式设置,因此内部函数有自己this的“阴影”,可以“遮蔽”外部函数的this.

q2:为什么我们不能像 arguments.forEach(self.write) 那样简单地编写 push 函数;

因为arguments对象不是数组,所以没有forEach方法。该行:

var args = [].concat.apply([], arguments);

使用arguments对象中的成员创建一个数组。它还可以这样做:

[].forEach.call(arguments, ...)

或(许多人喜欢):

Array.prototype.forEach.call(arguments, ...);

编辑

thisJack 提出的一个观点是,在函数中似乎self无论如何都是。但是this是由调用设置的,而不是由函数的分配或创建方式(忽略ES5 bind)设置,因此在看到调用之前你无法知道函数this将是什么。你还没有发布,所以我们不知道。例如

self.push = function () {
    ...
}

在这里,如果函数被调用,self.push()那么它this被设置为self反正。但是,如果将其this设置为其他内容,例如

var pushAlias = self.push;
...
pushAlias();

这里self.push是在没有this设置的情况下调用的,因此它将默认为全局/窗口对象(或在严格模式下未定义)。在函数内使用self意味着这无关紧要,函数this在分配给push方法时仍然具有对外部的引用。

于 2012-10-18T06:14:56.993 回答
0

Q1 在 Javascript 中,“this”在不同的时间可以是不同的东西,通过将 self 设为“this”,这意味着该分配时的“this”将始终是使用的 this。

Q2 参数看起来有点像一个数组,但它不是,所以首先它创建一个数组,以便可以在其上调用数组函数。

于 2012-10-18T06:15:09.423 回答