首页 > 解决方案 > IIFE 用于避免名称冲突?

问题描述

(function(){
  var a = b = 3;
})();

(function(){
  var a = b = 5;
})();


console.log(b)
console.log(a)

IIFE 有助于避免名称与其他模块发生冲突?我试过上面的代码来理解这个概念。基本上我可以假设上述两个 IIFE 代表两个不同的“模块”并且b不应该覆盖该变量吗?但是,我们可以将b被覆盖的值改为 5。

另一个问题是,为什么a在上述情况下未定义变量?我认为基本上代码将被翻译成下面

var a = b = 3;

let b = 3;
let a = b;

标签: javascript

解决方案


var a = b = 3;正是出于这个原因,它是一种反模式。当你这样做时b,永远不会用var. 它相当于:

b = 3         // no var makes b global 
var a = b;    // var a is scoped to enclosing function

这放入b了可能不是您想要的全局名称空间。

function test(){
  var a = b = 3;  // b 'looks' like it will be function scoped...but
}

test()
console.log(b) // b is global even though defined in the function


推荐阅读