为什么jQuery源代码如此频繁地使用逗号运算符进行变量赋值
Why does the jQuery source use the comma operator for variable assignment so much?
以下是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.
如果用这样的分号重写,代码会有同样的效果吗?或者我遗漏了什么?
如果它会有同样的效果,那么用逗号写它的风格原因是什么?(例如,我知道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,而不是一个变量列表。。。。
欢呼
- ||(OR)运算符如何在赋值中工作
- Javascript赋值运算符的奇怪行为
- JavaScript 中同一行上的多个比较/赋值运算符
- if子句中的赋值运算符赋值并执行检查
- 通过三元运算符的自赋值
- 什么's具有fn's赋值运算符两侧的名称(一个对象fn)
- JavaScript - 这些值赋值(使用 |= 作为运算符)是什么意思
- Javascript 赋值运算符不起作用
- JavaScript 中带有运算符的变量链式赋值
- 解构或赋值运算符
- JavaScript - 为什么加法赋值运算符不能按预期工作
- 三元运算符赋值优先级为变量
- 为什么jQuery源代码如此频繁地使用逗号运算符进行变量赋值
- Javascript性能,条件语句与赋值运算符
- javascript赋值和值[以及coma运算符]
- "||"运算符在为变量赋值时不起作用
- 一个语句中有多个加法赋值运算符
- 布尔值的按位赋值运算符,而不是更长表达式(|= 运算符)
- 赋值运算符,为什么结果是-3
- 带有条件和赋值运算符的表达式