如何创建方法两次?我无法理解如何在功能体中改变它。为什么它不起作用?
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]
答案 0 :(得分: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/正如您所看到的,大部分逻辑都属于您。
答案 1 :(得分: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
),使用你给它作为操作对象的第一个参数,第二个参数作为传递给该函数的参数(它作为一个数组)。更多on MDN和in the spec。碰巧push
允许您传递任意数量的参数,并按顺序推送每个参数。因此,如果您尝试第二次将数组的内容添加到数组中,那一行就会执行此操作(在现代浏览器中,一些较旧的IE实现不喜欢使用push.apply
)。 / p>