2017-04-13 5 views
0

저는 자바 스크립트로 개발하기 시작했으며 범위와 실행 컨텍스트에 대해 읽었습니다.Javascript - 함수 선언 간의 차이점

function fun1() { 
    var x = 1; 

    function fun2() { 
     x = x*2; 
     alert(x); 
    } 
} 

과 :

function fun1() { 
    var x = 1; 
    fun2(x); 
} 

function fun2 (x) { 
    x = x*2; 
    alert(x); 
} 

이 다른 한 사용하는 이유가 있을까,이 사이에 차이가 있는지 궁금 해서요? 그들은 성능/보안에 영향을 미칩니 까 (또는 초보자 JS 개발자에게는 예기치 않은 다른 영향을 미칩니 까?)?

+0

음 ... 첫번째 예제에서'fun2'를 호출하는 것은 불가능합니다. – Quentin

+0

두 번째 예는 재사용 성이 더 좋습니다. 이제 다른 함수에서 ** fun2 ** 함수를 다시 호출 할 수 있습니다. – user3004449

+0

@Quentin 불가능한 'fun1' 밖에서는 불가능합니다. – Arg0n

답변

0

첫 번째 접근 방식에 대해 이야기 할 경우 fun1 내에 동봉하고 범위가 로컬이므로 fun2으로 전화를 걸 수 없습니다. 다음과 같이 fun2를 호출하여 fun1을 ammend 수 그러나 :

var fun1 = (function(){ 

    var x = 1; 

    var fun2 = function(){ 
     x = x*2; 
     alert(x); 
    }; 

    return { 
     fun2: fun2 
    } 

})(); 

위의 return 문은 다음과 같이 당신이 fun1 객체를 호출 할 수 있습니다 당신의 fun2public로 범위를 만들 것입니다 :

fun1.fun2(); 

x 변수는 비공개이며 fun1 함수 내에서만 액세스 할 수 있습니다. fun1.x을 사용하여 액세스해야하는 경우 fun1에 반환해야하며 fun2을 반환했습니다.

이것을 modular or enclosed pattern이라고합니다. 이것으로 우리는 캡슐화를 달성 할 수 있습니다.

두 번째 방법, 즉 매우 간단하면 fun1fun2으로 전화 할 것입니다. 나는 그것이 개념을 깨끗이 해주기를 바란다.

2

첫 번째 경우에 fun2fun1 범위에서만 사용할 수 있습니다. 두 번째 경우 두 함수 모두 해당 범위에서 사용할 수 있습니다. 정의는

0

입니다. In 자바 스크립트 범위는 둘러싼 함수로 정의됩니다. 즉, 함수 내에 정의 된 코드는 함수 외부에서 볼 수 없습니다.

그래서, 따라서 func1 내에 정의하고, 당신의 1 예, func2func1 내부를 볼 수 있습니다.

두 번째 예제에서는 전역 범위 (브라우저에서 실행 중일 때 window 개체)에 정의되어 있으므로 어디서나 호출 할 수 있습니다 (func1).