2013-08-22 28 views
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] 
+1

不是。定影。那。碼。 – elclanrs

+0

你有沒有考慮過使用'return buf'和'a = a.twice()'? –

回答

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/正如你所看到的,大部分邏輯都是你的。

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 MDNin the spec。它發生push允許您傳遞任意數量的參數,並將按順序推送每個參數。所以,如果你想再次將數組的內容添加到數組中,那麼這一行就可以做到這一點(在現代瀏覽器上,一些較早的IE實現不喜歡這種使用push.apply)。