함수 대신 var로 함수 선언


28

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

var foo = function() {

    // things
};

내가 배운 방법 대신에

function foo() {

    // things
}

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


자바 스크립트에서 함수는 first-class-citizens 입니다. 이를 통해 객체처럼 동작을 전달할 수 있습니다. 이는 무엇보다도 콜백 및 위임에 매우 유용합니다.
Chris Bye

범위 . 변수 명 랩핑 "// things"는 본질적으로 / 랩핑하는 "// things"와 다른 JavaScript (파일)가 포함 된 이름 충돌을 방지합니다. 그것을 생각하는 또 다른 방법은 네임 스페이스 "foo"를 생성 한 것입니다.
radarbob

답변:


25

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

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

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

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

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


1
MY ... () 함수에 거기에 노는있어
에릭 Reppen

1
@ Demian Brecht, 그리고 var foo = function foo () {...} 접근은 어떻습니까?
shabunc

@ shabunc : 그것은 어떻습니까? 내 대답의 마지막 단락에 나와 있습니다.
데미안 브레히트

@Demian Brecht, 아니오, 실제로 마지막 단락에서 변수가 호출 foo되고 함수가 호출됩니다MY_function
shabunc

@ shabunc : 이름은 중요하지 않습니다. 중요한 것은 콜 스택의 가치입니다. 예를 들어 [NAMESPACE] _ [fn name]은 Mozilla에서 사용하는 규칙입니다. 컨벤션이 프로젝트 전체에서 일관된 한 이름 자체는 중요하지 않습니다.
데미안 브레히트

13

함수 표현 :

//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에 대해 레이블이 지정된 명령문을 항상 사용해야하므로 생성자를 통해 오브젝트의 '유형'을 식별 할 수 있습니다.


8

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

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

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를 보십시오


4

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

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();
}

7
JS의 함수 내부에 함수를 정의하는 데 아무런 문제가 없습니다. JS에서 함수를 정의 할 수없는 곳이 많지 않습니다.
Erik Reppen

2
@ErikReppen 함수가 아닌 블록 내에서 (if 문 내에서와 같은) 함수 선언을 확실히 사용할 수 없습니다. 다른 함수 내에서 사용할 수없는 곳을 읽을 수 없습니다.
오스틴

@Austin if명령문 내에서 함수 정의에 아무런 문제가 없습니다 !
Tim

@Austin : 아마도 w3schools에서 읽었 을까요? ;)
데미안 브레히트

2
@ErikReppen 함수 표현식은 어디에서나 사용할 수 있습니다. 함수 선언은 불가능합니다. stackoverflow.com/questions/10069204/…를
Austin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.