2013-04-06 2 views
4

내가 JS 책의 닌자 비밀 것을 읽고 예제 코드의이 부분을보고 있어요 :JS 코드의 간단한 조각을 이해 - 함수 -

var ninja = { 
     chirp: function signal(n) {        //#1 
     return n > 1 ? signal(n - 1) + "-chirp" : "chirp"; 
     } 
    }; 

    var samurai = { chirp: ninja.chirp }; 

    ninja = {}; 

그래서 내가 첫 번째 부분을 이해 : 우리는 개체가를 ninja 및 그것은 방법이 있습니다.

이제 우리는 samurai이라는 새 개체를 만들고 두 번째 부분을 이해했으며 chirp이라는 속성이 있습니다.

나를 혼란스럽게하는 부분은 ninja.chirp 일부입니까, 여기서 무엇을하고 있습니까? 어떻게 작동합니까?

+1

'nina.chirp'가'samurai '내부에서 복제 될 때'ninja'의 특정 속성을 호출하면'사무라이 '에서 액세스하려고 할 때 엄격한 경고 및/또는'정의되지 않은 '문제가 발생합니다. 그들은 거기에 없다. –

답변

5

ninja 개체 (기능)의 chirp 속성 값을 가져와 구성중인 개체의 속성 chirp에 할당합니다.

여기 (함수 대신 문자열을 사용) 간단한 예입니다 :이 예를 그렇게 여러 번 보았다

var foo, bar; 
foo = { "an": "object" }; 
bar = { "an": foo.an } 
alert(foo.an); 
alert(bar.an); 
+0

감사합니다. 그리고 다음 라인에서 그는 닌자 오브젝트를 지워 버렸지 만 여전히 짹짹이 부르면 작동합니다. Chrip은 닌자를 사용하고 닌자는 지워지지 만 여전히 짹짹이 작동합니다. 그래서 나는 그것이 어떻게 작동하는지 혼란 스럽다. –

+0

+1 예를 들어 ... –

+3

@ user1899082 - 가비지 수집은 더 이상의 변수/속성이 없을 때까지 함수를 삭제하지 않습니다. 'samurai.chirp'는 여전히 함수를 가지고 있기 때문에'ninja'를 지우면 지워지지 않습니다. – Quentin

2

, 그것은 끔찍한 예입니다. 우선, 명명 된 함수 표현식은 IE에서는 버그가 있지만, 단순히 arguments.callee을 참조 할 수 있으므로 완전히 불필요합니다.

그건 그렇고, 재귀 함수를 사용하여 문자열을 반복하는 것은 단지 문제를 묻는 것입니다. 모든 것은 훨씬 더 간단하게 만들 수있는 :

function signal(n) { 
    return new Array(n+1).join("-chirp").substr(1); 
} 
+3

그것이 코드에 대한 유효한 비평이지만, 질문에 대답하지 않습니다. – Quentin

+3

'arguments.callee'도 제가 기억하는 것으로 사용되지 않습니다. –

+0

하지만 IE에서 함수 표현식이 어떻게 버그가 있습니까? 그들은 메모리 누수 등을 일으키는 경향이 있습니까? –

1

여기에서, chirp는 자사가 samurai에 복사. 당신은 ninja 객체를 파괴 할 수 있고 여전히 samurai.chirp 메소드를 사용할 수 있습니다.

+0

아, 그것은 복사 가져옵니다. 나는 C++ 포인터처럼 생각하고 있었고 우리가 그것을 삭제했지만 어떻게 작동하는지 혼란 스러웠다. –

+2

복사되지 않습니다. 함수는 1 급 개체입니다. JS에서는 함수에 대한 참조 만 있습니다. 참조가 복사됩니다. – Quentin

+0

JavaScript에 참 참고 변수가 없습니다. 이것은 많은 혼란을 야기합니다. – rcdmk

관련 문제