Skip to content

Latest commit

 

History

History
executable file
·
95 lines (82 loc) · 1.75 KB

File metadata and controls

executable file
·
95 lines (82 loc) · 1.75 KB

IIFE(Immediately Invoked Function Expression)

JavaScript中,圆括号()是一种运算符,跟在函数名后表调用该函数

function关键字可以解释为语句,也可以当作表达式

// 语句
function f() {}
// 表达式
var f = function() {};

JavaScript引擎规定function关键字出现在行首则解释为语句,所以将其放在圆括号内让引擎解将其释为表达式

(function() {
  /* code */
})();
// 或者
(function() {
  /* code */
})();

分号为必须,否则遇到两个连续的IIFE会将第二个解释为第一个的参数导致报错

// 报错,第二行被解释为第一行的参数
(function() {
  /* code */
})()(
  (function() {
    /* code */
  })()
);

只要让解释器以表达式处理函数定义的方法都可以产生相同效果

var i = (function() {
  return 10;
})();
true &&
  (function() {
    /* code */
  })();
0,
  (function() {
    /* code */
  })();
!(function() {
  /* code */
})();
~(function() {
  /* code */
})();
-(function() {
  /* code */
})();
+(function() {
  /* code */
})();
new function() {
  /* code */
}();
// 只有传递参数时,才需要最后那个圆括号
new function() {
  /* code */
}();

通常只对匿名函数使用IIFE,避免污染全局变量与封装外部无法读取的私有变量

// 写法一
var tmp = newData; // 创建了一个全局变量
processData(tmp);
storeData(tmp);
// 写法二
(function() {
  var tmp = newData;
  processData(tmp);
  storeData(tmp);
})();

若需要全局对象需要传递参数

void (function(global) {
  // 在这里,global就是全局对象了
})(this); // 在浏览器里,this就是window对象