0

如何两次创建方法?我不明白如何在函数体中改变它。为什么它不起作用?

function twice() {
    var buf = [];
    for ( var i = 0; i < this.length; i++ ) {
        buf.push(this[i]);
    }

    for ( var i = 0; i < this.length; i++ ) {
        buf.push(this[i]);
    }
    this = buf;
}

Array.prototype.twice = twice;

a = [1,2,3];
a.twice(); 
a; // [1,2,3,1,2,3]
4

2 回答 2

2

您不能将值分配给this。这就是规则。但是你可以修改. this尝试将一些值推入this.

function twice() {
    var len = this.length;
    for (var i = 0; i < len; i++) {
        this.push(this[i]);
    }
}

Array.prototype.twice = twice;

a = [1, 2, 3];
a.twice();
alert(a);

这是一个小提琴。http://jsfiddle.net/Qvarj/如您所见,大部分逻辑都是您的。

于 2013-08-22T23:33:14.630 回答
2

我不明白如何在函数体中改变它

如果您指的是 的值this,则不能。但你不必为你正在做的事情

你非常接近,你只需要删除一点:

function twice() {
    var i, l;
    for (l = this.length, i = 0; i < l; ++i) {
        this.push(this[i]);
    }
}

请记住,您的数组是一个对象。要更改其内容,只需更改其内容,无需更改对它的引用。

但请注意,您可以在任何现代浏览器上使用此技巧:

function twice() {
    this.push.apply(this, this);
}

这通过使用Function#apply函数来工作,该函数调用你调用它的函数(因此,push在我们的例子中)使用你给它的第一个参数作为要操作的对象,第二个参数作为传递给该函数的参数(它它作为一个数组)。有关MDN规范的更多信息。碰巧push允许您向它传递任意数量的参数,并将按顺序推送每个参数。因此,如果您再次尝试将数组的内容添加到数组中,那一行就可以完成(在现代浏览器上,一些较旧的 IE 实现不喜欢这种使用push.apply)。

于 2013-08-22T23:34:04.100 回答