Javascript 为什么jQuery源代码在变量赋值中使用了这么多逗号运算符?

Javascript 为什么jQuery源代码在变量赋值中使用了这么多逗号运算符?,javascript,jquery,Javascript,Jquery,下面是从jQuery源代码(1.7.1)开始的摘录: 代码是一系列变量赋值,所有赋值都由逗号运算符连接。据我所知,它对前后的表达式求值,并返回后一个表达式的值 由于变量赋值链没有被赋值给任何东西,我突然想到,代码可以用分号代替逗号重写,而不会改变它的操作方式。例如 // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actuall

下面是从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 );
    }; /* <----- semicolon */

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

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

    // ...and so on.
//定义jQuery的本地副本
var jQuery=函数(选择器、上下文){
//jQuery对象实际上只是init构造函数“增强的”
返回新的jQuery.fn.init(选择器、上下文、rootjQuery);

}; /* 我认为这符合JSLint规则

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

我不知道为什么Crockford的工具鼓励使用逗号运算符时却使用逗号运算符。 信息本身是这样的:

将其与前面的“var”语句相结合


否。逗号用于分隔var声明,所有声明都使用第一个var前缀。例如:

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


var a = 1; // local
    b = 2; // global!
为了达到同样的效果,请这样写:

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

我个人认为这纯粹是坏习惯的变形和影响,来自造物主的主要语言。代码变得很难阅读,并带来混乱。特别是当与模块化模式结合使用时,在jQuery中,它们声明文本对象上的所有内容。jQuery似乎忘记了如何声明函数构造函数来实例化类,或者这根本不适用于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 );
    }; /* <----- 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.
//定义jQuery的本地副本
var jQuery=函数(选择器、上下文){
//jQuery对象实际上只是init构造函数“增强的”
返回新的jQuery.fn.init(选择器、上下文、rootjQuery);

}; /* 我认为这有几个原因:一是效率,二是代码整洁,三是变量范围

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

var var1;
var var2;
var var3;
引擎将查看var关键字,了解它定义的变量,然后查看参数。我想通过列表循环比每次重新评估var要好

原因2:对我来说,阅读由逗号分隔的列表比查看代码中某处的等号更具可读性

原因3:请注意,var定义了函数范围内的变量。如果您不使用var,您将在全局范围内定义变量

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


干杯

为了回应您的编辑,他说(我的重点):,(逗号)运算符-避免使用逗号运算符,除非在for语句的控制部分非常严格地使用逗号运算符。(这不适用于逗号分隔符,逗号分隔符用于对象文本、数组文本、变量语句和参数列表。)如果使用分号,则需要为每个变量写入变量,不是吗?@thirtydot:doh,明白了,很好。尽管在关于变量声明的部分中,他建议每行声明一次。(无可否认,他只是在那里声明,而不是声明和初始化。)您可以使用单个
var
和逗号运算符对每行进行一次声明。它将是一个单独的语句,但分布在多行中,每行一个变量。就我个人而言,在这些声明中包含单独行上的注释是很麻烦的,因为这样更难看到最初的
var
在哪里,而且我发现包含函数声明更麻烦。请参见,哦,亲爱的,当然,我不能相信我错过了这一点。谢谢,答案是1。非常好。至于2,我猜通过使用逗号运算符,他们在重复
var
时节省了时间,我猜这可能是一种较小的尺寸缩减策略(在gzip之后非常小)。当人们看代码时,重复“var”实际上有点“嘈杂”。。。但是,偶尔将var设置为全局变量是容易出错的。原因1,在的评论中,作者指出,与多次键入相比,一次键入
var
似乎对超过300000次迭代没有任何性能好处。我的观点是正确的。通过改变变量的数量(值大小和数量),我自己做了一些测试——在大多数情况下;符号实际上更快(chrome)。但是1000000次迭代的毫秒数。很好的一个-性能优化的第一条规则是measure.right,但这是逗号分隔符的一个实例。避免使用逗号运算符,除非在for语句的控制部分严格使用。(这不适用于逗号分隔符,它用于对象文字、数组文字、var语句和参数列表。)
var var1;
var var2;
var var3;