2013-08-22 3 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#apply 기능을 사용하여 작동
function twice() { 
    this.push.apply(this, this); 
} 

(그래서, 우리의 경우 push) 첫 번째 인수를 사용하여 작업 할 객체로 지정하고 두 번째 인수는 해당 함수로 전달할 인수로 사용합니다 (배열로 사용함). on MDNin the spec. push을 사용하면 임의의 수의 인수를 전달할 수 있으며 각 인수를 순서대로 밀어 넣습니다. 따라서 배열의 내용을 두 번째 배열에 추가하려고하면 그 한 줄에서 수행하게됩니다 (현대의 브라우저에서는 일부 이전 IE 구현이 push.apply의 사용을 좋아하지 않습니다).

관련 문제