Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这两个JavaScript声明之间有什么区别?_Javascript - Fatal编程技术网

这两个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,如果s
x==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;