javascript自我和参数用法

时间:2012-10-18 06:10:20

标签: javascript node.js

我是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函数;

2 个答案:

答案 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参数看起来有点像数组,但它不是,所以首先创建一个数组,以便可以在其上调用数组函数。