2016-08-31 2 views
0

내 질문을 설명하는 방법을 알지 못합니다. able가 '정의되지 않은 :자바 스크립트의 변수 정의

(function(fn){ 
    var able=123; 
    function tmp(){ 
     fn() 
    }; 
    tmp(); 
})(function(){alert(able)}); 

이 조각은 참조 오류가 발생합니다.

자바 스크립트가 내게 어떻게 변수가되는지 설명해 주시겠습니까?

+1

'able'가 정의되는 외부 함수에 연결된 로컬 스코프가 따라서 IIFE 안에는 접근 할 수 없기 때문에. – Tushar

+1

IIFE에는 자체 범위가 있기 때문에 -> [JavaScript에서 (function() {})() 구문은 무엇입니까?] (http://stackoverflow.com/questions/8228281/what-is-the-function- construct-in-javascript) – adeneo

+0

함수가 매개 변수로 전달 될 때'()'에 특정 범위가 있습니까? – passion

답변

0

함수는 작성시 렉시 컬 클로저를 만듭니다. 즉, 알림 기능을 만들 때 able 변수가 존재하지 않습니다. 잠시 후에 가능하다는 것을 알고있는 어휘 클로저에서 fn의 실행을 래핑하면 이미 작성한 어휘 클로우즈 fn에 영향을주지 않습니다.

당신이하려는 일에 대해 더 잘 설명하는 질문이 나오면, 그 아이디어를 표현하기 위해 클로저를 올바르게 사용하는 방법을 제안 할 수 있습니다.

2

"fn"함수의 범위는 "parent"함수와 동일하지 않으므로 fn 함수를 호출 할 때 "able"인수를 전달해야하며 다음과 같이 fn 함수 자체에서이를 지정해야합니다 :

(function(fn){ 
    var able=123; 
    function tmp(){ 
     fn(able) 
    }; 
    tmp(); 
})(function(able){alert(able)}); 
+0

스 니펫이 잘됩니다. 그러나 나는 그것이 내 질문을 해결할 수 있다고 생각하지 않는다. 나는 그들이 위에 언급 한 것을 꽤 이해하지 못합니다, IIFE! 꽤 혼란스러워. – passion

+0

여기서 이해할 수있는 것은 변수 선언입니다. 함수에 var 선언을 설정하면 해당 함수와 그 안에있는 함수 만이이 변수에 액세스 할 수 있습니다. 'var able = 123; 은 (기능 (FN) { 기능 TMP() { FN() }; TMP는(); }() 함수()는 {경고) (수});이 경우' 는 "수"입니다 상위 범위에서이 옵션을 사용하면 동일한 수준 또는 낮은 수준의 모든 함수에서 변수에 액세스 할 수 있습니다. –

+0

globle 범위에서'able' 선언하면 어디서든 액세스 할 수 있습니다 ... – passion

0

로컬 및 글로벌 범위 기능에서의 Java 스크립트 지원. 이 경우 "able"은 함수 외부에서 액세스 할 수없는 로컬 함수 범위입니다.
var를 사용하면 변수는 로컬 범위에서 선언됩니다. 유 그냥 VAR없이 변수를 선언 할 경우, 전역 범위에서 선언됩니다

+0

내 생각에 내 param 함수는'able'에 액세스 할 수있는'tmp' 함수에서 실행되었습니다. . – passion

0
코드는 사용하여이 이름 지정된 함수와 같이 다시 작성할 수 있습니다

:

var func1 = function(fn) { 
    var able=123; 
    function tmp(){ 
     fn() 
    }; 
    tmp(); 
} 
var func2 = function() { 
    alert(able) 
} 
func1(func2); 

나는 이런 식으로 변수가 분명하다 생각 'able'은 'func1'(더 정확하게는 로컬 범위)에 정의되어 있으며 'func1'의 범위를 벗어나는 'func2'내부에서 액세스하려고하므로이 범위로 '볼 수 없습니다'. 자바 스크립트 스코핑 약

자세한 정보는 다음 What is the scope of variables in JavaScript?

+0

이 사실을 이해할 수는 있지만 내 질문을 이해하는 데 도움이되지 않습니다. – passion

+0

방금 ​​조금 더 많은 정보를 추가하기 위해 답을 편집했습니다. 충분하지 않은 경우 질문을 구체적으로 작성하십시오. –

관련 문제