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, ...);
编辑
this
Jack 提出的一个观点是,在函数中似乎self
无论如何都是。但是this
是由调用设置的,而不是由函数的分配或创建方式(忽略ES5 bind)设置,因此在看到调用之前你无法知道函数this
将是什么。你还没有发布,所以我们不知道。例如
self.push = function () {
...
}
在这里,如果函数被调用,self.push()
那么它this
被设置为self
反正。但是,如果将其this
设置为其他内容,例如
var pushAlias = self.push;
...
pushAlias();
这里self.push
是在没有this
设置的情况下调用的,因此它将默认为全局/窗口对象(或在严格模式下未定义)。在函数内使用self
意味着这无关紧要,函数this
在分配给push
方法时仍然具有对外部的引用。