我经常看到以下代码:
(function () {
// init part
})();
Run Code Online (Sandbox Code Playgroud)
但我永远无法理解它是如何运作的.我发现最后一个括号特别令人困惑.有人可以解释它在执行上下文(EC)和变量对象(VO)方面的工作原理吗?
可能重复:
"(function(){})()"和"(function(){}())"在JavaScript中功能相同吗?
这是我还没有想到的东西,但是我一直在使用function(){}(),因为我添加了括号后我的VIM语法突出显示,虽然我已经看过(function(){}) ()很多次,也许它是一个IE的东西?
编辑:
var singleton = function() {
// code
}();
var singleton = (function() {
// code
})();
Run Code Online (Sandbox Code Playgroud) 可能重复:
自动执行匿名JavaScript函数的括号位置?
有时我看到:
(function() { ... }());
Run Code Online (Sandbox Code Playgroud)
有时我看到:
(function() { ... })();
Run Code Online (Sandbox Code Playgroud)
这两种形式有区别吗?是否有任何令人信服的理由使用一种形式而不是另一种形式?
(function($, window, undefined){
... jquery code...
})(jQuery, window);
Run Code Online (Sandbox Code Playgroud)
它到底意味着什么?这也意味着$(document).ready()什么?或者只是两件不同的事情?
在许多书籍/ 博客文章中,自调用匿名函数模式的方式如下:
(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) 我在Javascript中看到过这样的自调用函数:
(function () {
// foo!
})();
Run Code Online (Sandbox Code Playgroud)
但我也看到他们这样写:
(function () {
// bar!
}());
Run Code Online (Sandbox Code Playgroud)
从语法上讲,它们完全相同.实际上,我的个人习惯是第一种格式,但是我应该注意两者之间有什么区别吗?像浏览器纠结或其他什么?
例如,一个非常微不足道的事情是,如果第二种格式应该可靠地工作,那么这意味着这样的事情也应该是可能的:
function () {
// shut the front door! saved two characters right there!
}();
Run Code Online (Sandbox Code Playgroud)
尽管如此,这会伤害可读性.
显然,ES6不需要命名空间,因为每个文件都是一个单独的模块.
但是,如何避免全局命名空间干扰?
例如,巴贝尔编译我scripts/main.js仅仅通过替换文件const用var.
var alert = 'This line doesn\'t do anything.'
window.alert(alert)Run Code Online (Sandbox Code Playgroud)
ANS使用IIFE的命名空间(如下所示)可防止名称冲突:
const ANS = (function () {
const alert = 'This works'
window.alert(alert + '.')
return {alert: alert + ' too.'}
})()
alert(ANS.alert)Run Code Online (Sandbox Code Playgroud)
向命名空间添加属性ANS比将它们添加到全局命名空间更简洁window,或this.而且,IIFE提供了进一步的封装.
那么,不是第二种方式,即用IIFE创建自定义命名空间,比第一种更好吗?如果是这样,在ES2015中有更新/更好的方法吗?Babel为什么不为我这样做?
可能重复:
自动执行匿名JavaScript函数的括号位置?
答案可能很简单,但我只是好奇.
我已经看到自编写的函数
(function() {
//...
}());
Run Code Online (Sandbox Code Playgroud)
和
(function() {
//...
})();
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 ×9
babeljs ×1
closures ×1
ecmascript-6 ×1
function ×1
iife ×1
jquery ×1
namespaces ×1
syntax ×1