함수 대신 var로 함수 선언 점점 더 함수가 선언되는 것을보고 있습니다. var

점점 더 함수가 선언되는 것을보고 있습니다.

var foo = function() {

    // things
};

내가 배운 방법 대신에

function foo() {

    // things
}

차이점이 뭐야? 더 나은 성능? 범위? 이 방법을 사용해야합니까?



답변

var foo = function() {} 익명 함수를 참조하는 변수를 정의합니다.

function foo() {}명명 된 함수를 정의합니다 foo.

함수 매개 변수로 이름으로 전달 될 수 있으며 의도 된 용도가 OOP에 사용되는 경우 인스턴스화 될 수 있습니다.

하루가 끝날 때, 어느 것이 사용 하는가는 특정 유스 케이스에 크게 좌우됩니다 (자바 스크립트는 그와 같이 재미 있습니다;)). 전자를 사용 하게 되면 함수의 이름을 지정하는 것이 좋습니다.

var foo = function MY_function() {}. 이 명명 규칙은 디버거 콜 스택이 쓸모 없도록 도와줍니다.


답변

함수 표현 :

//someFunction(); //wouldn't work when uncommented
var someFunction = function(){ alert('yay'); };

이 경우 func 표현식은 익명이지만 참조를 위해 var에 할당됩니다. 이것은 다음과 같은 방식으로 레이블이 지정된 함수 명령문과 다릅니다.

  • 게양 할 수 없습니다 (정의되기 전에 호출)
  • new someFunction().constructor.name === 'someFunction';//false 함수에 대한 참조가 var에 할당되었지만 함수가 아닌 var가 var 이름에 연결되어 있기 때문에 인스턴스는 constructor.name에 대한 var 이름을 가져 오지 않습니다.

레이블이 지정된 함수 명령문에서 :

//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
  • 게양 작업
  • new someFunction().constructor.name === 'someFunction'; //true 이름은 함수에 직접 연결됩니다.

일반적으로 말해서 상황이 바뀌거나 한 줄로 메소드를 정의 / 할당하는 경우 호출이 실패하지 않는 한 var에 표현식을 수행해야 할 큰 이유는 없습니다. 실제로 맨 아래에 내부 func 및 메서드 정의를 사용하여 객체를 구성하는 데 유용한 호이 스팅이 발견되어 객체의 실제 동작에 도달하고 한 줄의 공용 메서드 정의 ( this.동일한 이름으로 func를 할당하여 )를 한 번에 수행 할 수 있습니다. 쉽게 참조 할 수있는 지점. 생성자 IMO에 대해 레이블이 지정된 명령문을 항상 사용해야하므로 생성자를 통해 오브젝트의 ‘유형’을 식별 할 수 있습니다.


답변

첫 번째 예제는 표현식 이고 두 번째 예제는 명령문 입니다. 함수를 표현식으로 정의하면 정의가 발생할 수있는 위치, 할당 할 수있는 항목, 매개 변수로 전달할 수있는 등의 유연성이 향상됩니다.

예를 들면 다음과 같습니다.

SomeThing('abc', function(a,b) {return a*b;});

대 …

function tmp(a,b) {
    return a*b;
}

SomeThing('abc', tmp);

더 복잡한 예제는 함수 표현식 구문 없이는 매우 복잡합니다.

https://stackoverflow.com/questions/111102/how-do-javascript-closures-work를 보십시오


답변

실질적인 차이점은 게양입니다. 예를 들면 다음과 같습니다.

foo(); // alerts 'hello'
function foo() {alert('hello');}

vs

foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}

또한 이것은 정의되지 않은 동작입니다.

function foo(){
  if (true) {
    function bar(){}
  }
  bar();
}

괜찮습니다.

function foo(){
  if (true) {
    var bar = function(){}
  }
  bar();
}