2011-10-31 67 views
2

好吧,我知道什么是FunctionDeclarationFunctionExpression之间的差异。 @CMS做了一个解释的great job。直到最近,我以前用的是相同的语法创建lambda表达式命名空间以下Douglas Crockford's例如:的JSLint抱怨函数表达式语法命名空间

(function() { 
    "use strict"; 
}()); 

他所持该convention如下:

当一个功能就是要立即调用,整个调用表达式应该包装在parens中,以便明确正在生成的值是函数的结果,而不是函数本身。

该语法非常适用于lambda表达式,因为它们返回一个值。但是,名称空间不返回值。因此,我现在更喜欢使用下面的语法命名空间,而不是(从JavaScript Garden拍摄):

(function() { 
    "use strict"; 
})(); 

使用这种语法是作为背后的基本原理如下:

(// evaluate the function inside the paranthesis 
function() {} 
) // and return the function object 
() // call the result of the evaluation 

使用这种语法对于命名空间对我更有意义,因为:此语法分隔了命名空间和调用;并且Douglas Crockford's语法期望该函数返回一个值。

但是,当我通过JSLint传递此语法时,出现错误,指出“Move the invocation into the parens that contain the function.”。我不明白为什么它会抱怨这个语法。这是一个广泛使用和接受的语法。

我打算通知Douglas Crockford关于这个问题。但是,在我这样做之前,我会感谢您提供的任何反馈。也许最好是坚持自己的语法?请解释你的观点。

+4

它抱怨的语法,因为这是克罗克福德先生的意见,它应该。这就是JSLint的全部内容:机器人封装了Crock对JavaScript编码风格的看法。 – Pointy

+0

事实上,当JSLint强加给每个人的首选编码风格时,这真的很烦人。我经常使用JSLint,并且很难看到我完美的语义良好的代码生成错误。 –

+2

对于不想遵循Crockfords标准的人来说[jsHint](http://www.jshint.com),他不会去改变他们,因为他花了很多时间来确定JavaScript的团队开发的最佳实践。 – JaredMcAteer

回答

1

回想起来,我认为克罗克福德的观点完全是教条。他说:

当一个函数被立即调用,整个调用表达式应该在括号包裹,这样很明显,正在生产值函数的结果,而不是本身的功能。

那么我的论点是,当一个函数被立即调用时,它不清楚所产生的值是函数的结果而不是函数本身?试想一下:

所产生的值是函数:

var f = function() { 
    "use strict;" 
}; 

所产生的值是函数的结果:

var x = (function() { 
    "use strict;" 
})(); 

如果你想值是产生作为功能本身,然后根本不使用parens。无论如何使用它们都没有意义。

理解有许多程序员谁仍然将其分配给一个变量之前包裹在括号中的函数表达式,或者谁是一个虐待狂,做这样的事情混淆道格:

var x = function() { 
    "use strict;" 
}(); 

但是有多难是否了解发生了什么?也许在最后一个例子中,您需要向下滚动数百行代码才能找到,但一个好的程序员会为其他人省去麻烦,并将函数包装在parens中;或者,如果他是一个吝啬鬼:

var x = ~function() { 
    "use strict;" 
}(); 

身边我也不会甚至懒得读书人谁是在让我骂他一意孤行编写的代码。回到这个问题,虽然我真的不喜欢Crockford的语法的原因是因为他将函数和调用分组在单个圆括号中。对我来说,这是等同于以下情况:

var x = (f()); 

function f() { 
    "use strict;" 
} 

显然包装在括号的函数调用看起来有点傻,有点多余,但是这就是我想象它是,它总是惹恼我,但每个人都以自己的方式。我个人认为我的语法看起来更干净。

相关问题