为什么jQuery源代码使用逗号运算符进行变量赋值呢?

时间:2012-02-29 10:13:14

标签: javascript jquery

这是从jQuery源代码(1.7.1)开始的摘录:

// 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,它会评估它之前和之后的表达式,并返回后者的值。

由于变量赋值链没有分配给任何东西,因此让我感到震惊的是代码可以用分号代替逗号来重写,而不会改变它的运算方式。 E.g。

// 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),虽然我不知道为什么。)

4 个答案:

答案 0 :(得分:7)

没有。逗号分隔var声明,全部使用第一个var前缀。 E.g:

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


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

为了达到同样的效果,请这样写:

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

答案 1 :(得分: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,则会创建或覆盖全局变量。

答案 2 :(得分:0)

我认为这符合JSLint规则。

JSLint希望变量声明用逗号分隔而不是分号。

我不确定为什么Crockford在他的工具鼓励它时会拒绝逗号运算符。 信息自述:

  

将此与之前的'var'语句相结合。

答案 3 :(得分:0)

我认为这有几个原因:一个效率,第二个代码整洁和第三个变量范围。

原因1 :如果您指定:var var1,var2,var3;,引擎会知道您正在传递变量列表,因为您在列表前面加上“var”关键字。如果你愿意的话

var var1;
var var2;
var var3;

引擎会查看var关键字,了解它的定义变量,然后查看参数。我想循环遍历列表比每次重新评估var更好

原因2 :对我而言,阅读以逗号分隔的列表比在代码中某处查看等号更具可读性。

原因3 :请注意var定义了函数范围内的变量。如果你没有在var之前,那么你将在全局范围内定义变量。

p.s - 像jshint这样的jslinters经常抱怨如果你在一个范围内有多个变量而不是一个变量列表....

欢呼声