我是javascript的新手。我在这里有一个简单的问题。
我在下面看到代码snipet:
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:为什么我们不能像push.forEach(self.write)那样简单地编写push函数;
答案 0 :(得分:3)
q1:为什么设置self = this。
当内部函数想要在闭包中保持对外部函数this
的引用时使用。 this
的值由函数的调用方式设置,因此内部函数有自己的this
,它“阴影”外部函数的this
。
q2:为什么我们不能像push.forEach(self.write)那样简单地编写push函数;
因为arguments object不是数组,所以没有forEach
方法。这一行:
var args = [].concat.apply([], arguments);
使用 arguments 对象中的成员创建一个数组。它也可以:
[].forEach.call(arguments, ...)
或(很多人喜欢):
Array.prototype.forEach.call(arguments, ...);
Jack提出的一点是,无论如何,函数中的this
似乎都是self
。但this
是由调用设置的,而不是由函数的分配或创建方式设置的(忽略ES5 bind),因此在看到调用之前,您无法确定函数的this
是什么。你没有发布,所以我们不知道。 e.g。
self.push = function () {
...
}
此处,如果函数被调用为self.push()
,则无论如何其this
都设置为self
。但是,如果将this
设置为其他内容,例如
var pushAlias = self.push;
...
pushAlias();
这里调用self.push
时没有设置this
,因此它将默认为全局/窗口对象(或在严格模式下未定义)。在函数中使用self
意味着这并不重要,该函数在分配给this
方法时仍然引用外部push
。
答案 1 :(得分:0)
Q1在Javascript中,"这个"在不同的时间,通过自我制造可以是不同的东西,这个"这意味着"这个"在该任务时将永远是这个使用。
Q2参数看起来有点像数组,但它不是,所以首先创建一个数组,以便可以在其上调用数组函数。