2013-02-22 2 views
2

JavaScript의 두 선언 사이에 다른 점은 무엇입니까? 하나는 함수 주위에 괄호가 있고 다른 하나는 그렇지 않습니까?자바 스크립트에서 모듈의 두 선언 사이의 차이점은 무엇입니까?

한 기사는 말한다

주목하라() 익명 함수 주위에. 토큰 기능으로 시작하는 명령문은 항상 이며, 항상 함수 선언으로 간주되므로이 언어가 언어에 필요합니다. Including()은 대신 ​​ 함수 표현식을 만듭니다.

두 가지 모두 동일한 것으로 간주됩니다.

var person = (function() { 
    // Private 
    var name = "Robert"; 
    return { 
     getName: function() { 
      return name; 
     }, 
     setName: function(newName) { 
      name = newName; 
     } 
    }; 
}()); 

var person = function() { 
    // Private 
    var name = "Robert"; 
    return { 
     getName: function() { 
      return name; 
     }, 
     setName: function(newName) { 
      name = newName; 
     } 
    }; 
}(); 
+0

[함수 선언] (http://ecma-international.org/ecma-262/5.1/#sec-13)도 아니며 둘 다 함수 표현식입니다. – RobG

+0

차이는 없습니다. –

+0

보통 두 번째 것은'person() '을 통해 먼저 인스턴스화되어야하지만 런타임 환경에 버그가있을 수 있습니다. –

답변

3

함수는 JavaScript에서 선언과 표현식의 두 가지 유형입니다.

  1. 함수 선언을 올리게된다

    이 둘 사이의 차이이다. 즉, 자바 스크립트의 선언문이 인 으로 프로그램에 나타나기 전에 함수를 호출 할 수 있습니다.
  2. 함수 표현식을 즉시 호출 할 수 있습니다. 함수 선언은 할 수 없습니다. 이는 표현 을 나타내거나 값을 반환하기 때문입니다. 함수 표현식은 함수를 표현합니다.

함수 선언의 예 : foo 함수 선언 때문에

foo("bar"); 

function foo(bar) { 
    alert("foo" + bar); 
} 

상기 프로그램이 동작한다.

foo("bar"); // throws an error, foo is undefined - not a function 

var foo = function (bar) { 
    alert("foo" + bar); 
}; 

상기 프로그램 foo 나중에 함수 표현식의 값을 할당 한 후, undefined 선언하고 게양 될 때 작동하지 않을 것이다. 따라서 전화 할 때 undefined입니다.

함수식의 예 : 위 함수가 바로이 함수의 식으로 호출된다

(function (bar) { 
    alert("foo" + bar); 
}("bar")); 

.

function (bar) { 
    alert("foo" + bar); 
}("bar"); // throws an error, can't call undefined 

위 함수는 함수 선언이므로 즉시 호출되지 않습니다. 선언은 표현 (또는 값을 반환)하지 않는다는 것을 기억하십시오. 따라서 undefined을 함수로 호출하는 것과 같습니다.

함수는 어떻게 표현식이됩니까?

함수가 표현식이 필요한 컨텍스트에서 사용되면 표현식으로 처리됩니다. 그렇지 않으면 선언으로 처리됩니다.

  1. 당신은 변수 (즉 identifier = expression)에 값을 할당하고 다음과 같은 경우

    표현식이 예상된다.

  2. 괄호 안의 숫자입니다 (즉, (expression)).
  3. 연산자의 피연산자로 (즉, operator expression).

는 따라서 다음과 같은 모든 기능 표현식 :

var foo = function() {}; 
(function() {}); 
~function() {}; 

모든 다른 함수 선언이다. 간단히 말해서 함수 앞에 아무 것도 없으면 선언입니다.https://github.com/aaditmshah/codemirror-repl/blob/master/scripts/index.js#L94

다음 함수 isExpression 어떤 임의의 자바 스크립트 코드가 표현인지 여부를 테스트하는 데 사용됩니다 :이 당신의 마음에 의심을 지 웁니다

function isExpression(code) { 
    if (/^\s*function\s/.test(code)) return false; 

    try { 
     Function("return " + code); 
     return true; 
    } catch (error) { 
     return false; 
    } 
} 

희망

이 코드를 참조하십시오. 요컨대

:

  1. 가 표현하거나 (이 경우에 기능) 값을 리턴하는 함수. 따라서 즉시 호출 할 수는 있지만 프로그램에 나타나기 전에 호출 할 수는 없습니다.
  2. 함수 선언은 호이스트입니다. 따라서 프로그램에 나타나기 전에 호출 될 수 있습니다. 그러나 어떤 값도 표현하지 않기 때문에 즉시 호출 할 수 없습니다.
1

의 차이는 기록 할 때이다 :

var foo = (function() { 
      ... 
}()); 

()을 그룹화 (불필요하지만 유용한)의 사용은 매우에서 명확하게하는 일반적인 코딩 스타일이다 첫 번째 줄처럼 오른쪽이 가장 먼저 호출되는 함수 식 (IIFE)입니다. 그러나 두 번째 :

var foo = function() { 
      ... 
}(); 

마지막 줄을 읽을 때까지 명확하지 않습니다. 이는 몇 줄 아래에있을 수 있습니다. 괄호가 너무 일반 할당에 사용할 수 있다는

var foo = function() { 
      ... 
}; 

참고 : 당신이 마지막 줄에 도달 할 때까지, 당신은 아마 당신이 일반 과제 읽는 줄 알았는데

var foo = (function() { 
      ... 
}); 

하지만이 경우를 그들은 정말 불필요한 것입니다 (그리고 아마도 IIFE를 사용하는 관행 때문에 오도 된 것일 수 있습니다).

An Important Pair of Parens을 참조하십시오.

1

현재 상황에서는 통역사와 아무런 차이가 없습니다. 모듈을 작성 일반적으로 바람직한 방법은 괄호 기능을 포장하는 것입니다 :

구문이 깨끗하고 분명히 당신이 그것을 선언 직후 함수를 호출 할 것인지 때문이다
var person = (function() { 
    // Private 
    var name = "Robert"; 
    return { 
     getName : function() { 
      return name; 
     } 
    }; 
}()); 

.

(function() { 
    //some stuff 
}()); 

작동하지만

function() { 
    //some stuff 
}(); 

이 늘 것 때문에 또 하나의 이유입니다.

일반적으로 좋은 코드 인 일반적인 코드 작성 스타일을 사용할 때마다 함수를 래핑함으로써 :-).