📅  最后修改于: 2023-12-03 15:38:57.371000             🧑  作者: Mango
在 JavaScript 中,立即调用函数表达式(Immediately Invoked Function Expression,IIFE)是一种常见的用于在函数作用域内隔离代码的技术。由于 IIFE 自身执行,因此可以避免将全局作用域内的变量污染到其他文件中。但是,在使用 IIFE 时,必须小心防止在函数内部意外覆盖全局变量。本文将讨论如何防止覆盖。
在 IIFE 中,使用 let 或 const 定义变量可以确保变量在函数内部作用域中。这样可以避免变量污染全局作用域。
(function() {
const x = 1;
console.log(x); // 1
})();
console.log(x); // ReferenceError: x is not defined
在 ES6 中,可以使用默认参数语法来定义局部变量,这样可以避免在函数内部覆盖全局变量。
(function() {
function foo(x = 1) {
console.log(x);
}
foo(); // 1
})();
console.log(x); // ReferenceError: x is not defined
可以使用 Object.freeze() 方法来冻结对象,这样就无法更改对象的属性。可以确保在 IIFE 中定义的对象不会被意外更改。
(function() {
const obj = Object.freeze({ x: 1 });
console.log(obj.x); // 1
obj.x = 2; // TypeError: Cannot assign to read only property 'x' of object '#<Object>'
})();
可以使用闭包来包装私有变量,从而实现对全局作用域的隔离。
const obj = (function() {
let x = 1;
return {
getX: function() {
return x;
},
setX: function(val) {
x = val;
},
};
})();
console.log(obj.getX()); // 1
obj.setX(2);
console.log(obj.getX()); // 2
console.log(x); // ReferenceError: x is not defined
在 JavaScript 中,使用 IIFE 是常见的隔离代码的技术,但是必须小心防止意外覆盖全局变量。可以使用 let 或 const 定义变量、使用默认参数、使用 Object.freeze() 冻结对象和使用闭包来实现对全局作用域的隔离。