我最近将当前版本的json2.js与我在项目中的版本进行了比较,并注意到函数表达式的创建和自我执行方式有所不同.
用于在括号中包装匿名函数然后执行它的代码,
(function () {
// code here
})();
Run Code Online (Sandbox Code Playgroud)
但现在它将自动执行的函数包含在括号中.
(function () {
// code here
}());
Run Code Online (Sandbox Code Playgroud)
有通过CMS在接受答案的注释解释JavaScript的封装匿名函数的语法是"既:(function(){})();
和(function(){}());
有效."
我想知道有什么区别?前者是否通过绕过全局匿名函数来占用内存?括号应该放在哪里?
我经常看到以下代码:
(function () {
// init part
})();
Run Code Online (Sandbox Code Playgroud)
但我永远无法理解它是如何运作的.我发现最后一个括号特别令人困惑.有人可以解释它在执行上下文(EC)和变量对象(VO)方面的工作原理吗?
均低于警戒这些代码块foo
,然后bar
.唯一的区别是})()
和}())
.
代码1:
(function()
{
bar = 'bar';
alert('foo');
})();
alert(bar);
Run Code Online (Sandbox Code Playgroud)
代码2:
(function()
{
bar = 'bar';
alert('foo');
}());
alert(bar);
Run Code Online (Sandbox Code Playgroud)
除了语法之外,还有什么区别吗?
"Unknown type"
通过Closure Compiler运行一个相当大的库时,我收到了很多警告,当我的类型在自动执行的匿名函数中声明时,它们似乎就出现了.这没有什么奇特之处,但是如果我将自执行函数剥离出来,类型声明似乎起作用(至少在这个简单的测试中).
我不确定我的代码注释是否有问题,或者代码中是否存在任何违法行为,但我认为这都是犹太教和模块化API的标准方法.
以下测试代码创建一个命名空间(只是一个普通的旧JS对象)并附加一个枚举(一个对象文字)和一个函数.
var mynamespace = {};
(function (mynamespace) {
/**
* Some enum.
* @enum {number}
*/
mynamespace.SomeEnum = {
FOO: 1,
BAR: 2
};
/**
* Frazzle some type.
* @param {mynamespace.SomeEnum} qux The type to frazzle.
* @return {boolean} whether the operation succeeded.
*/
mynamespace.frazzle = function(qux) {
return true;
}
}(mynamespace));
// call it
mynamespace.frazzle(mynamespace.SomeEnum.FOO);
Run Code Online (Sandbox Code Playgroud)
看起来很好,对吗?闭包编译错误:
[jscomp] Compiling 1 file(s) with 37 extern(s)
[jscomp] X:\dev\solclientjs\sdk\tools\jscomptest.js:14: WARNING - Parse error. Unknown type mynamespace.SomeEnum
[jscomp] …
Run Code Online (Sandbox Code Playgroud) 在许多书籍/ 博客文章中,自调用匿名函数模式的方式如下:
(function() {
var foo = 'bar';
})();
Run Code Online (Sandbox Code Playgroud)
但是,在此上运行JSLint会出现此错误:
将调用移动到包含该函数的parens中.
例如将其改为此作品:
(function() {
var foo = 'bar';
}());
Run Code Online (Sandbox Code Playgroud)
问题
function(){}()
抛出一个SyntaxError: Unexpected token (
function(){}()
) - 工作正常
编辑:这是对此的一些后续(虽然我不会说完全重复):JSLint错误:"将调用移动到包含该函数的parens",所以我的主要问题是#3,为什么它完全有效?
(function(){
//something here...
})() <--//This part right here.
Run Code Online (Sandbox Code Playgroud)
究竟是什么)()
?
如果我改成它())
怎么办?
(function(){
//something here...
}()) <--//Like this
Run Code Online (Sandbox Code Playgroud) 有人可以解释这些闭包之间的区别吗?有区别吗?我以前没见过第二个例子(里面的括号).
(function(a, b) {
//...
})(x, y);
// Parentheses inside
(function(a, b) {
//...
}(x, y));
Run Code Online (Sandbox Code Playgroud)
在这里,这些闭包之间有区别吗?是否有一个地方有一个场景会出现差异?
FOO.Bar = (function() {
//...
})();
FOO.Bar = (function() {
//...
}());
Run Code Online (Sandbox Code Playgroud) 我在javascript文件中看到了很多这样的模式:
(function ($)
{
//Perform operation X
}(jQuery));
Run Code Online (Sandbox Code Playgroud)
将上述代码放在js文件中与以下内容之间是否有区别:
function myFunc($)
{
//Perform operation X
}
myFunc(jQuery);
Run Code Online (Sandbox Code Playgroud)
或者它更简洁?