2012-08-03 2 views
4

내가 왜 이런 짓을 했을까 : 대신의명명 된 함수를 선언하는 대신 변수에 함수를 할당하는 이유는 무엇입니까?

var myfunc = function() { /* code */ }; 

... 

myfunc(); 

을 : 다른 통해 하나를 사용의 장점은

function myfunc() { /* code */ } 

... 

myfunc(); 

이 있습니까? 두 가지 예가 다른 곳에서 사용되는 것을 보았습니다.

+0

[함수 및 함수 영역 (https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/) 및 [기능] (https://developer.mozilla.org/en/JavaScript/참조/운영자/기능). –

+1

[이 답변을 확인하십시오] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip). –

+0

나는 그 차이점을 알고 있다고 가정합니다. 그 자체만으로도 본질적으로 "더 우수"하거나 이점을 제공하지는 못합니다 (명명 된 함수로 디버깅을 쉽게 할 수 있지만 명명 된 함수 표현식을 사용할 수도 있음). 그것은 스타일의 문제입니다. –

답변

4

유일한 차이점을 익명 함수는 동안 명명 된 기능 캔 자신을 재귀 적으로 호출 할 수 있다는 것입니다 수 있습니다. 이들 모두, 이름이 지정된 함수 표현식 수 있습니다하여 예 결합 구조의 세 번째 유형이있다 : 함수가 정상적으로 declarated 경우

var myfunc = function myfunc() { /* code */ }; 
+1

익명 함수 *는 값이 변경되지 않는 한 변수 이름을 통해 자체를 호출 할 수 있습니다. 그래서 그것은 실제로 매우 연약한 구조입니다. –

+1

@FelixKling : 당신 말이 맞아요, 지적 해 주셔서 고마워요. – casablanca

-2

약간의 차이가 있습니다. 대부분 실용적입니다. 함수를 'var'할 때, 일반적인 가정은 일종의 '지역적'범위 함수입니다 (중첩 함수를 생각해보십시오). 당신이 할 때, function myFunction() {}, 기능은 대부분 전역 범위로 간주됩니다 (익명 함수 안에서도 이것을 감쌀 수 있습니다).

자바 스크립트 '클래스'의 경우 로컬 범위의 함수를 만들려면 'var'을 사용하여 선언해야합니다.

var myClass = function() { 
var test = function() { 
    //This function has local scope 
    } 
}; 

위의 설명에 덧붙여서, 이것은 간단한 예입니다.

var myVariable = resultFunction(); 


    function resultFunction() { 
    return 1; 
    } 

위의 코드가 작동합니다. 그러나 다음과 같은

var myVariable = resultFunction(); 


var resultFunction = function() { 
    return 1; 
}; 

할 수 없습니다하지만 당신은 지금까지 내가 말할 수있는

var resultFunction = function() { 
    return 1; 
}; 

var myVariable = resultFunction(); 
+0

나는 그것이 맞는 것 같지 않습니다. 편집 : [내가 말할 수있는] (http://jsfiddle.net/FkHuA/). –

+1

나는 당신이 당신의 예를 가지고 보여주고 싶은 것이 확실하지 않지만, 당신이 틀렸다는 것을 확신합니다. 지역 함수를 선언 할 때'var'을 사용할 필요가 없습니다 ... 저는 오해를 최근에 자주 보았습니다. –

+0

마지막 두 예제에서 [hoisting] (http://jsfiddle.net/FkHuA/1/)에 대해 설명하고 있습니다 (참조로 전달). 그것은 당신이 처음에 말했던 것과 같지 않습니다. 당신은 예를 들어 모든 것이 섞여 있고 당신이 주장하는 것을 실제로 묘사하지 않습니다. –

3

는, 함수 이름 (식별자)는 삭제 가능한되지 않습니다 심지어 경우 식별자가 다시 선언됩니다. 식별자는 범위가 끝나면 삭제됩니다.

function myfunc() { /* code */ }; 

if (delete myfunc) { //will fail 
    alert('myfunc deleted'); 
} else { 
    alert('can not delete myfunc'); 
} 

myfunc = null; 

if (delete myfunc) { //will still fail 
    alert('myfunc deleted'); 
} else { 
    alert('can not delete myfunc'); 
} 

var myfunc = null; 

if (delete myfunc) { //will still fail 
    alert('myfunc deleted'); 
} else { 
    alert('can not delete myfunc'); 
} 

그러나 함수 선언을 변수에 할당하면 식별자를 삭제할 수 있습니다. 이 기능은 전역 함수를 만들어야하지만 일시적으로 만 사용해야하므로 더 이상 필요하지 않을 때 삭제하거나 타사 스크립트와 식별자가 충돌하지 않도록 할 때 유용합니다.

var myfunc = function() { /* code */ }; 

if (delete myfunc) { //will succeed 
    alert('myfunc deleted'); 
} else { 
    alert('can not delete myfunc'); 
} 

//or... 
var myfunc = function myrealfunc() { /* code */ }; 

if (delete myfunc) { //will succeed 
    alert('myfunc deleted'); 
} else { 
    alert('can not delete myfunc'); 
} 
관련 문제