Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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_Jquery - Fatal编程技术网

Javascript 解释了自执行函数语法和回调语法

Javascript 解释了自执行函数语法和回调语法,javascript,jquery,Javascript,Jquery,也许是个有点傻的问题 但我想了解为什么自执行函数及其回调函数的语法与其他所有JS语法如此不同 (function () { })() 我只需要理解为什么用()封装它是有效的,我不会猜到它是有效的,然后是回调的额外()(就在它后面,我也不会期望它是有效的) 有人能给我解释一下吗?函数(…){…}part是一个函数表达式,即表示函数的表达式。在这种情况下,它必须用括号括起来的唯一原因是,如果关键字function是语句中的第一件事,则该语句被假定为函数语句,即函数声明。(实际上,它不一定要用括号括

也许是个有点傻的问题

但我想了解为什么自执行函数及其回调函数的语法与其他所有JS语法如此不同

(function () {
})()
我只需要理解为什么用
()
封装它是有效的,我不会猜到它是有效的,然后是回调的额外
()
(就在它后面,我也不会期望它是有效的)

有人能给我解释一下吗?

函数(…){…}part是一个函数表达式,即表示函数的表达式。在这种情况下,它必须用括号括起来的唯一原因是,如果关键字
function
是语句中的第一件事,则该语句被假定为函数语句,即函数声明。(实际上,它不一定要用括号括起来;它还可以用
+
作为前缀,或者通常在
函数
之前放置任何类型的标记,以防止函数语句解释。)

函数表达式后面的
()
部分与调用函数的正常
()
部分相同。这是:

(function (...) {...})(...);
(除了临时变量外)与此相同:

var f = function (...) {...};
f();
这相当于:

function f(...) {...};
f();

基本上,外圆括号允许对函数对象进行完全解释和实例化,因此一旦退出这些圆括号的作用域,函数对象就可以被调用了。

请参见此处:

当按您所做的方式声明时,您将其用作函数表达式(从上述链接定义函数的第三种方式)。与任何表达式一样,此
(表达式)
计算为表达式-此处使用括号是为了在必要时建立优先级。因此,您可以编写此表达式,例如:

var f = function(a) {
    var s = (((( 1 )))) + (((( a ))));
    console.log(s);
};

((((( f ))))) (2);
(),然后删除具有相同结果的所有不必要的括号(基本上是打印
1+2=3

(function(...) { ... }) 
是一个接受某些参数并有一个要执行的主体的函数。这是:

(function(...) { ... })()
相当于:

var f = (function(...) { ... });
// Now f is a function that can be called
f();

匿名函数很有用,除其他外,有两个原因-它们是匿名的(即它们不创建其他名称-再次参见上面的SOq链接),它们是其他不需要全局的东西的“容器”。

这里有一个立即调用的函数表达式,也称为IFFE(读iffy)是一种使用JS函数作用域生成词法范围的设计模式。这些模式用于避免变量提升,污染全局环境,同时允许公众访问方法,同时保留函数中声明的变量的局部隐私。 理解这一点的关键是JS具有函数作用域而不是块作用域,并在闭包内通过引用传递值。
您可以在处进一步阅读。

做同样事情的另一种替代方法的可能重复是
new function(){…};
。new为您调用函数。@darkport:一个主要区别是
new function(){…}
将函数作为构造函数调用。因此,
这个
内部将不同,表达式将对新创建的对象求值,而不是对
function(){…}
返回的任何对象求值。(我猜您已经知道了这一点,但我认为为了那些不知道的人的利益,将其显式化是值得的!)@鲁克:你能再解释一下吗?@qwertymk:如果
f
是一个函数,那么
new f
创建一个新对象,调用
f
,其中
this
就是那个新对象,然后返回该对象。例如,
new String
创建并返回一个新字符串,以及
new function(){this.foo='bar';}
创建并返回一个新对象,其
foo
属性设置为
'bar'
。谢谢大家,谢谢ruakh。我明白你的意思。我想关键是理解函数实际声明的三种方式。