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