2012-02-29 2 views
3

여기 발췌이다에서 JQuery와 소스 코드 (1.7.1) 시작 :jQuery 소스가 변수 할당을 위해 쉼표 연산자를 사용하는 이유는 무엇입니까?

// Define a local copy of jQuery 
var jQuery = function(selector, context) { 
     // The jQuery object is actually just the init constructor 'enhanced' 
     return new jQuery.fn.init(selector, context, rootjQuery); 
    }, 

    // Map over jQuery in case of overwrite 
    _jQuery = window.jQuery, 

    // Map over the $ in case of overwrite 
    _$ = window.$, 


    // ...continues... 


    // [[Class]] -> type pairs 
    class2type = {}; 

코드는 가변 할당하는 일련의 모든 콤마 연산자에 의해 결합이있다. the comma operator을 이해하면 앞뒤의 표현식을 평가하고 후행 표현식의 값을 반환합니다.

변수 할당 체인이 아무 것도 지정되지 않았기 때문에 코드가 작동 방식을 변경하지 않고 쉼표 대신 세미콜론으로 다시 쓸 수 있다는 사실을 알게되었습니다. 예 :

// Define a local copy of jQuery 
var jQuery = function(selector, context) { 
     // The jQuery object is actually just the init constructor 'enhanced' 
     return new jQuery.fn.init(selector, context, rootjQuery); 
    }; /* <----- semicolon */ 

    // Map over jQuery in case of overwrite 
    _jQuery = window.jQuery; /* <----- semicolon */ 

    // Map over the $ in case of overwrite 
    _$ = window.$; /* <----- semicolon */ 

    // ...and so on. 
  1. 이 같은 세미콜론으로 다시 작성하는 경우 코드는 동일한 효과를겠습니까, 아니면 내가 뭔가를 놓친 거지?

  2. 일 때 동일한 효과가있는 경우 쉼표로 쓰는 이유는 무엇입니까? (나는 이유는 모르겠지만 내가, 예를 들어, 그 Crockford doesn’t like the comma operator (see near the bottom)을 알고있다.)

+2

, 그는 (강조 광산 말한다) :, (쉼표) 연산자 - for 명령문의 제어 부분에서 매우 규칙적인 사용을 제외하고 쉼표 연산자의 사용을 피하십시오. (* 객체 리터럴, 배열 리터럴, * var 문 * 및 매개 변수 목록에 사용되는 쉼표 구분 기호 *에는 적용되지 않습니다.) – thirtydot

+2

세미콜론을 사용하면 각 변수에 대해 var를 작성해야합니다. isn ' 그렇지? – Brij

+0

@thirtydot : doh, 잡았다, 좋은 곳. 변수 선언 섹션에서 한 줄에 하나의 선언을 제안합니다. (분명히 그는 단지 선언하고 초기화하는 것보다 선언하는 것입니다.) –

답변

0

나는이 JSLint 규칙을 준수 생각합니다.

JSLint는 변수 선언을 세미콜론이 아닌 쉼표로 구분합니다.

Crockford가 자신의 도구가 장려 할 때 쉼표 연산자를 사용하는 이유가 확실하지 않습니다. 메시지 읽기 :

이전의 'var'문과 결합하십시오.

+1

맞지만 쉼표 * 구분 기호 *의 인스턴스입니다. "for 명령문의 컨트롤 부분에서 매우 규칙적인 사용을 제외하고는 쉼표 연산자를 사용하지 마십시오 (이 기능은 객체 리터럴, 배열 리터럴, var 문 및 매개 변수 목록에 사용되는 쉼표 구분 기호에는 적용되지 않습니다)." – benesch

7

아니요 쉼표로 구분 된 var 선언입니다. 모두 첫 번째 var 접두사를 사용합니다. 예컨대 : 동일한 효과를 얻을 그것을 이런 식으로 쓰기 위해

var a = 1, // local 
    b = 2; // local 


var a = 1; // local 
    b = 2; // global! 

:

var a = 1; // local 
var b = 2; // local 
+0

* Ah * - 오, 이런, 물론, 내가 그것을 놓쳤다는 것을 믿을 수 없다. 고맙습니다, 그 대답은 1. 우수합니다. 2.에 대해서는 쉼표 연산자를 사용하여 'var'를 반복 할 때 저장하는 것으로 추측됩니다.이 경우 크기 축소 전략이 작을 수 있습니다 (gzipping 후 매우 작음). –

+0

"var"를 반복하는 것은 코드를 보면 다소 시끄럽다. 그러나 var 전역을 가끔 만드는 것은 오류가 발생하기 쉽다. – kirilloid

2

개인적으로 나는이 창조자의 주요 언어와 순수 나쁜 습관 변형과 영향력을 생각합니다. 이 코드는 읽기가 어렵고 혼란을 가져옵니다. 특히 jQuery에서 리터럴 객체에 대한 모든 것을 선언하는 모듈 패턴과 함께 사용할 때 특히 그렇습니다. jQuery는 클래스를 인스턴스화하는 함수 생성자를 선언하는 방법을 잊어 버렸거나 간단하게 jQuery 스타일에 적용되지 않는다. 당신이 VAR를 생략하면

// Define a local copy of jQuery 
var jQuery = function(selector, context) { 
     // The jQuery object is actually just the init constructor 'enhanced' 
     return new jQuery.fn.init(selector, context, rootjQuery); 
    }; /* <----- semicolon */ 

    // Map over jQuery in case of overwrite 
    var _jQuery = window.jQuery; /* <----- semicolon */ 

    // Map over the $ in case of overwrite 
    var _$ = window.$; /* <----- semicolon */ 

    // ...and so on. 

당신이 전역 변수를 만들거나 덮어 쓰게됩니다 : 당신은 각 변수의 앞에 VAR을 추가하는 경우 세미콜론 (;)으로 작성된 경우

코드는 동일한 효과를 얻을 수 있습니다.

0

나는 하나의 효율성, 두 번째 코드 정리 및 세 번째 변수 범위 지정과 같은 몇 가지 이유가 있다고 생각합니다.

이유 : var var1,var2,var3;을 지정하면 엔진은 "var"키워드를 사용하여 목록 앞에 있기 때문에 변수 목록을 전달한다는 것을 알게됩니다.만약 당신이 할 것이면

var var1; 
var var2; 
var var3; 

엔진은 var 키워드를 보게 될 것이고, 그것은 변수를 정의하는 것을 이해하고 논쟁을 살펴볼 것입니다. 나는 목록을 반복 할 때마다 var를 재평가하는 것이 낫다고 생각한다.

이유 2 : 나는 코드의 어딘가에서 등호를 보는 것보다 쉼표로 구분 된 목록을 읽는 것이 훨씬 더 읽기 쉽다.

이유 3 : var는 함수 범위 내에서 변수를 정의합니다. var로 시작하지 않으면 전역 범위에서 변수를 정의하게됩니다.

PS - 당신이 범위 내에서 변수가 아닌 하나 개의 목록을 여러 바르이있는 경우 jshint 같은 jslinters 자주 불평 ....

환호 귀하의 편집에 대응

+0

이유 1에서 [이 블로그 게시물] (http://wonko.com/post/try-to-use-one-var-statement-per-scope-in-javascript)의 의견에서 저자는 30 만 번 반복하면'var '을 한 번 입력 할 때 여러 번 입력하는 것과 달리 성능상의 이점이없는 것처럼 보입니다. –

+1

나는 고쳐졌다. 변수의 양 (값의 크기와 양)을 변경하면서 내 자신의 테스트를 만들었습니다 - 대부분의 경우; 실제로는 표기법이 더 빨랐습니다 (크롬). 그러나 1,000,000 회 반복에 대한 밀리 초 단위입니다. – Avi

+0

좋은 하나 - 성능 최적화의 첫 번째 규칙은 측정 값입니다. –

관련 문제