2013-06-28 1 views
3

내가 "일반적으로 자바 스크립트 및 프로그래밍에 새로 온과 자바 스크립트 계몽 (88 페이지)라는 책에서 코드 블록에 온 중첩 된 익명 함수를 호출 :(자바 스크립트)

var parentFunction = function() { 
    var foo = 'foo'; 
    return function() { // anonymous function being returned 
     console.log(foo); // logs 'foo' 
    } 
} 
// nestedFunction refers to the nested function returned from parentFunction 

var nestedFunction = parentFunction(); 

nestedFunction(); /* logs foo because the returned function accesses foo 
via the scope chain */ 

var nestedFunction = parentFunction();를 설정하면 모든 단지 parentFunction(); 로그만을 사용하는 반면 콘솔에 "foo는"중첩 된 익명 함수를 호출하고 로그인 할 수 nestedFunction(); 수 있도록 않습니다 기본적으로

+0

을이 링크를 참조하여 주시기 바랍니다/docs/웹/JavaScript/Guide/Closures – HMR

답변

3

을 당신이하고있는?

parentFunction()(); // double parenthesis 

괄호는 값을 반환하는 함수를 실행한다는 의미입니다. 그 값이 function이면 실행할 수 있습니다.

당신이 한 번만 호출하면, 음, 당신은 단지 기능을 얻을 그래서 아무것도를 호출하지 않고 parentFunction 반환 익명 함수를 호출 console.log 검정 고시

+0

아하! 이것은 의미가 있습니다. 귀하의 명확하고 간결한 설명에 감사 드리며 답변 한 모든 사람들에게도 감사드립니다. – edubba

4

가져옵니다.

nestedFunctionparentFunction, 익명 함수의 반품으로 설정됩니다.

따라서 nestedFunction을 호출하면 익명 함수이 호출됩니다.

익명 함수console.log을 사용하므로 "foo"이 표시됩니다.

0

parentFunction은 실행하기 위해 호출해야하는 중첩 된 함수를 반환하기 때문에.

var a = nestedFunction; 
이 실행되지 않았기 때문에 당신이 할 때까지

은 아무것도 기록하지 않습니다 : 당신이 부모를 보듯이

var nestedFunction = null; 

var parentFunction = function() { 
    var foo = 'foo'; 
    nestedFunction = function() { // anonymous function being returned 
     console.log(foo); // logs 'foo' 
    } 
} 

parentFunction(); 
// outputs nothing 
// but initializes nestedFunction by its local function 

nestedFunction(); /* logs foo because that local function has access to local 'foo' of 
the parent function */ 

:

a(); 
0

이 아니라 그 코드를 다시 작성 함수는 아무것도 출력하지 않지만 함수 참조로 nestedFunction 변수를 초기화합니다. 그리고 그 함수 참조는 다른 어떤 함수처럼 호출 될 수 있습니다.

1

코드에 대한 대안은이

var parentFunction = function() { 
    this.foo = "foo"; 
    this.something = function(){ 
    console.log(this.foo); 
    } 
    return this.something.bind(this); 
} 

parentFunction()(); 
// => "foo" 
1
function add (x) { 
    return function (y) { 
     return x + y; 
    }; 
} 
var add5 = add(5); 
add5(3); 
처럼 할 거라고, 그래서 당신은 어떤 점에서 범위가 뭔가를하고 싶은 것, 필연적으로이

var parentFunction = function() { 
    var foo = "foo"; 
    return console.log.bind(console); 
} 

parentFunction()(); 
// => "foo" 

입니다

설명 :

add 함수가 호출되면 리턴됩니다. 함수. 이 함수는 컨텍스트를 닫고 매개 변수 x가 정확히 그 시점에 있었던 것을 기억합니다 (즉,5 위의 코드에서) add 함수를 호출 한 결과가 add5 변수에 할당되면 처음 생성되었을 때의 x를 항상 알 수 있습니다. 위의 add5 변수는 전송할 값에 항상 값 5를 추가하는 함수를 나타냅니다. 즉 값 3으로 add5가 호출되면 3과 함께 5가 추가되고

이 반환됩니다. https://developer.mozilla.org/en-US : foo는이 그것이 JS가 somehing라는 클로저를 사용하기 때문에 범위를 벗어나 있어야한다하더라도 액세스 할 수있는 이유는 ...

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

관련 문제