这两个JavaScript声明之间有什么区别?
其中一个“这两个JavaScript声明之间有什么区别?,javascript,Javascript,其中一个“()”在里面,另一个在外面。这是: 没有实际的区别,只是让Javascript引擎将函数视为一个值的方式上的细微差别 使用(function(){}())您导致函数成为值,因为语句不能以括号开头。使用(function(){})()使用括号首先将函数作为值求值,然后调用它。没有区别 [不必要的]括号只是在不同的地方。由于函数声明的位置,它已经是一个表达式。如果声明位于语句上下文中(讽刺的是,它们会将其转换回表达式上下文),则括号将产生不同的效果,同时仍然会产生等效的代码,而事实并非如
()
”在里面,另一个在外面。这是:
没有实际的区别,只是让Javascript引擎将函数视为一个值的方式上的细微差别
使用
(function(){}())代码>您导致函数成为值,因为语句不能以括号开头。使用(function(){})()代码>使用括号首先将函数作为值求值,然后调用它。没有区别
[不必要的]括号只是在不同的地方。由于函数声明的位置,它已经是一个表达式。如果声明位于语句上下文中(讽刺的是,它们会将其转换回表达式上下文),则括号将产生不同的效果,同时仍然会产生等效的代码,而事实并非如此
在类似场景中,括号的常见用法是用于自调用函数。在这种情况下,括号是必需的,因为
function x () { alert("hi!") } ()
被解析为
function x () { alert("hi!") }; ()
当它以语句或“块的顶级元素”的形式出现时,它被解析为“FunctionDeclaration”。因此,通常使用以下形式:
(function () { alert("hi!") })()
这是因为function…
不再是如上所述的语句,而是一个表达式(解析为“FunctionExpression”),表达式可以继续,因此不会像前一种情况那样出现错误。还要注意,函数名可以省略
但是,由于在post中,函数…
出现在=
(在“AssignmentExpression”中)右侧的中,因此它已经在表达式上下文中(被解析为“FunctionExpression”),因此不需要额外的括号
所有这些都是相同的,但我更喜欢第二种形式(为了代码的一致性):
快乐的编码。没有真正的区别。两者的工作方式相同。如果要传递,则需要使用第一个模式,其中调用括号位于另一组括号内。如果不这样做,将出现以下错误:
将调用移到包含函数的参数中
还请注意,第一组括号不是必需的。没有它们它也可以工作,但JSLint会再次失败:
将立即函数调用封装在括号中,以帮助
读者理解该表达式是
函数,而不是函数本身
几个相关问题:
我认为这两者的区别是一样的:
var myObj = {bla:'blabla'};
var a = (myObj);
var b = myObj;
…没有区别:)结束括号的意思是:当要立即调用函数时,应将整个调用表达式包装在参数中,以便清楚地表明生成的值是函数的结果,而不是函数本身。(摘自)
因此,如果使用{}(),函数将立即执行,变量将被分配函数结果
然后,如果使用({})(),如果()之间有一个函数,则执行该函数并将值分配给变量
在我看来,如果它们包含相同的功能,那么它们就是相同的东西 第二种模式通常被称为模块模式,我不是JS忍者,希望看到正确的答案。可能的重复您找到了为什么选择JSLint的原因吗?这似乎是武断的…@Guffa-我认为这是武断的。这正是克罗克福德认为他喜欢的。就我个人而言,我倾向于遵循这两条JSLint规则,但我非常确定这绝对没有什么区别(至少在本例中是这样)。我相信外括号是出于可读性原因而存在的。它们清楚地表明,对于不太熟悉JS更复杂特性的其他开发人员来说,结尾的()
并不是一个打字错误。IMHO,如果sx==1,这同样适用于速记foo':y==2?“foobar':'bar'
比(x==1?'foo':(y==2?'foobar':'bar'))需要更长的时间来读取,并且更容易出错。
。以后也更容易编辑…我不喜欢(或使用)JSLint,但是+1指出了这一点。。。怪癖。你想解释一下什么是“语句上下文”吗?@Kumar查看语法规则。我为创建函数对象的两种不同语法结构添加了“适当”术语。注意,表达式语句不能以{
或函数开始,这会强制将作为块的“顶级元素”出现的函数定义视为函数声明。在这两种情况下函数(){}
首先对函数对象求值。括号会强制它成为表达式……但它已经是表达式了。@pst:是的,在这种情况下它已经是表达式了,但以这种方式使用括号的常见目的是使它成为表达式。这就是括号存在的原因,即使在ass中使用时不需要括号很公平;为了保持一致性,我确实更喜欢[内]括号形式。
a = function () {} ()
b = (function () {}) ()
c = (function () {} ())
var myObj = {bla:'blabla'};
var a = (myObj);
var b = myObj;