我一直在寻找关于自我调用函数的信息,在某个地方我偶然发现了这个符号:
+function(){}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下+这个功能前面的符号意味着什么?
我曾经知道这意味着什么,但我现在正在努力...
这基本上是说document.onload吗?
(function () {
})();
Run Code Online (Sandbox Code Playgroud) 我最近一直在阅读很多Javascript,并且我注意到要导入的.js文件中的整个文件包含如下所示.
(function() {
...
code
...
})();
Run Code Online (Sandbox Code Playgroud)
这样做的原因是什么,而不是一组简单的构造函数?
在javascript中,你想什么时候使用它:
(function(){
//Bunch of code...
})();
Run Code Online (Sandbox Code Playgroud)
对此:
//Bunch of code...
Run Code Online (Sandbox Code Playgroud) 我正在阅读一些关于闭包的帖子,到处都看到了这个,但是没有明确的解释它是如何工作的 - 每次我被告知要使用它......:
// Create a new anonymous function, to use as a wrapper
(function(){
// The variable that would, normally, be global
var msg = "Thanks for visiting!";
// Binding a new function to a global object
window.onunload = function(){
// Which uses the 'hidden' variable
alert( msg );
};
// Close off the anonymous function and execute it
})();
Run Code Online (Sandbox Code Playgroud)
好的,我看到我们将创建新的匿名函数,然后执行它.所以在那之后这个简单的代码应该工作(并且确实如此):
(function (msg){alert(msg)})('SO');
Run Code Online (Sandbox Code Playgroud)
我的问题是这里发生了什么样的魔术?当我写作时我想:
(function (msg){alert(msg)})
Run Code Online (Sandbox Code Playgroud)
然后会创建一个新的未命名函数,如函数""(msg)...
但那么为什么这不起作用?
(function (msg){alert(msg)});
('SO');
Run Code Online (Sandbox Code Playgroud)
为什么它需要在同一行?
你能指点一些帖子或给我解释一下吗?
我遇到了一些JavaScript代码,但我不知道该怎么做.为什么运行此代码时会得到"1"?这个奇怪的小附录是什么(1),为什么函数包含在括号中?
(function(x){
delete x;
return x;
})(1);
Run Code Online (Sandbox Code Playgroud) 有一个JSLint选项,实际上是一个好的部分,"[需要]围绕立即调用的parens,"意味着构造
(function () {
// ...
})();
Run Code Online (Sandbox Code Playgroud)
反而需要写成
(function () {
// ...
}());
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 任何人都可以解释为什么第二种形式可能被认为更好?它更有弹性吗?不容易出错?它比第一种形式有什么优势?
自从提出这个问题以来,我逐渐理解了在函数值和函数值之间进行清晰视觉区分的重要性.考虑立即调用的结果是赋值表达式的右侧的情况:
var someVar = (function () {
// ...
}());
Run Code Online (Sandbox Code Playgroud)
尽管最外面的括号在语法上是不必要的,但是左括号给出了一个预先指示,即所分配的值不是函数本身,而是调用函数的结果.
这类似于Crockford关于构造函数大写的建议 - 它可以作为任何查看源代码的人的视觉提示.
我最近将当前版本的json2.js与我在项目中的版本进行了比较,并注意到函数表达式的创建和自我执行方式有所不同.
用于在括号中包装匿名函数然后执行它的代码,
(function () {
// code here
})();
Run Code Online (Sandbox Code Playgroud)
但现在它将自动执行的函数包含在括号中.
(function () {
// code here
}());
Run Code Online (Sandbox Code Playgroud)
有通过CMS在接受答案的注释解释JavaScript的封装匿名函数的语法是"既:(function(){})();和(function(){}());有效."
我想知道有什么区别?前者是否通过绕过全局匿名函数来占用内存?括号应该放在哪里?
我正在研究THREE.js并注意到一个模式,其中函数的定义如下:
var foo = ( function () {
var bar = new Bar();
return function ( ) {
//actual logic using bar from above.
//return result;
};
}());
Run Code Online (Sandbox Code Playgroud)
(示例请参见此处的 raycast方法).
这种方法的正常变化如下所示:
var foo = function () {
var bar = new Bar();
//actual logic.
//return result;
};
Run Code Online (Sandbox Code Playgroud)
将第一个版本与正常变体进行比较,第一个版本似乎有不同之处:
因此,主要区别在于,在第一个变体中,条形图在初始化时仅分配一次,而第二个变体在每次调用时都创建此临时变量.
我最好猜测为什么使用它是为了限制bar的实例数(只有一个),从而节省了内存管理开销.
我的问题:
可能重复:
感叹号在功能之前做了什么?
我长期以来使用以下JavaScript在JavaScript中执行自动执行的匿名函数:
(function () { /* magic happens */ })()
Run Code Online (Sandbox Code Playgroud)
最近,我开始看到以下模式的更多实例(例如,在Bootstrap中):
!function () { /* presumably the same magic happens */ }()
Run Code Online (Sandbox Code Playgroud)
任何人都知道第二种模式的优势是什么?或者,这只是一种风格偏好吗?
iife ×10
javascript ×10
syntax ×3
closures ×2
function ×2
coding-style ×1
iif ×1
jslint ×1
operators ×1
parentheses ×1
scope ×1