我知道这是什么,但我现在很纠结。
这是不是说 document.onload?
(function () {
})();
匿名函数自己调用自己
引入一个匿名函数,然后调用:
(function (local_arg) {
// anonymous function
console.log(local_arg);})(arg);
立即调用函数表达式(IIFE)立即调用一个函数。 这仅仅意味着函数在定义完成后立即执行。
还有三个常见的语句:
// Crockford's preference - parens on the inside(function() {
console.log('Welcome to the Internet. Please follow me.');}());
//The OPs example, parentheses on the outside(function() {
console.log('Welcome to the Internet. Please follow me.');})();
//Using the exclamation mark operator//https://stackoverflow.com/a/5654929/1175496!function() {
console.log('Welcome to the Internet. Please follow me.');}();
如果它的返回值没有特殊的要求,那么可以写:
!function(){}(); // => true~function(){}(); // => -1+function(){}(); // => NaN-function(){}(); // => NaN
或者,可以是
~(function(){})();void function(){}();true && function(){ /* code */ }();15.0, function(){ /* code */ }();
甚至可以写
new function(){ /* code */ }31.new function(){ /* code */ }() //If no parameters, the last () is not required
它只是一个匿名函数,在创建之后立即执行。
这就好比你把它赋给一个变量,然后马上使用它,只是没有变量:
var f = function () {};
f();
在 jQuery 中有一个类似的构造,可能会想到:
$(function(){});
这是绑定ready 的简写形式:
$(document).ready(function(){});
这是一个立即调用函数表达式(Immediately-Invoked Function Expression)
,或者简称 IIFE。 它在创建之后立即执行。
它与任何事件处理程序无关(例如 document.onload)。考虑第一对括号中的部分: (function (){})() ; ... 它是一个正则函数表达式。 然后查看最后一个(function (){})() ; ,它通常被添加到表达式中以调用函数; 在这种情况下,是我们的先验表达式。
当试图避免破坏全局namespace时,常常使用这种模式,因为 IIFE 中使用的所有变量(与任何其他常规函数一样)在其范围之外都不可见。 这可能就是为什么将这个与 window.onload 的事件处理程序混淆的原因,因为它通常是这样的:
(function(){
// all your code here
var foo = function() {};
window.onload = foo;
// ...})();// foo is unreachable here (it’s undefined)
函数在创建之后立即执行,而不是在解析之后。 在执行整个脚本块中的任何代码之前,都会对其进行解析。 此外,解析代码并不意味着它会被执行,例如,如果 IIFE 位于函数内部,那么在函数被调用之前它不会被执行。
因为这是一个相当流行的话题,所以值得一提的是 IIFE 也可以用 ES6的箭头函数来编写:
((foo) => foo)('foo value')