这是从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.
如果用这样的分号重写,代码会有相同的效果,还是我错过了什么?
如果 具有相同的效果,用逗号编写它的样式原因是什么? (我知道,例如,Crockford doesn’t like the comma operator (see near the bottom),虽然我不知道为什么。)
答案 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经常抱怨如果你在一个范围内有多个变量而不是一个变量列表....
欢呼声