为什么jQuery源代码如此频繁地使用逗号运算符进行变量赋值

Why does the jQuery source use the comma operator for variable assignment so much?

本文关键字:运算符 赋值 变量 源代码 jQuery 为什么      更新时间:2023-09-26

以下是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 = {};

代码是一系列变量赋值,所有赋值都由逗号运算符连接。正如我所理解的逗号运算符,它计算前后的表达式,并返回后一个表达式的值。

由于变量赋值链没有被分配给任何东西,我突然想到,代码可以用分号代替逗号重写,而不会改变它的操作方式。例如

// 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不喜欢逗号运算符(见底部),尽管我不知道为什么。)

否。逗号分隔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样式。

如果在每个变量前面添加一个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,则将创建或覆盖全局变量。

我认为这符合JSLint规则。

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

我不知道为什么Crockford在他的工具鼓励逗号运算符的情况下谴责它。信息itelf显示:

将其与前面的"var"语句结合使用。

我认为这有几个原因:一是效率,二是代码整洁,三是变量作用域。

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

var var1;
var var2;
var var3;

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

原因2:对我来说,阅读用逗号分隔的列表比在代码中的某个地方看等号更可读。

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

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

欢呼