Javascript IIFE和正则函数之间的差异(示例)

Javascript IIFE和正则函数之间的差异(示例),javascript,Javascript,了解IIFE,我知道使用IIFE可以: 不污染全球范围 保护您的代码不受他人攻击 有人能帮我更好地理解它,并给出一个真实的例子,说明当我使用常规函数语句(而不是od IIFE)时,什么时候会遇到麻烦。IIFE将实际运行(立即调用函数表达式),他们不需要触发器或函数调用来启动它们,因此,变量将被设置为其响应 这里有一把小提琴来证明这一点: var iffe=(函数(){ 返回“foo”; })(); var func=函数(){ 返回“bar”; }; console.log('iife='

了解IIFE,我知道使用IIFE可以:

  • 不污染全球范围
  • 保护您的代码不受他人攻击

有人能帮我更好地理解它,并给出一个真实的例子,说明当我使用常规函数语句(而不是od IIFE)时,什么时候会遇到麻烦。

IIFE将实际运行(立即调用函数表达式),他们不需要触发器或函数调用来启动它们,因此,变量将被设置为其响应

这里有一把小提琴来证明这一点:

var iffe=(函数(){
返回“foo”;
})();
var func=函数(){
返回“bar”;
};
console.log('iife='+iffe);

log('non-iife='+func)假设您有一个相当大的代码库(几千行或更多)。将每个函数放在顶层不是一个好主意,因为这样很容易意外地编写两次函数名,这会由于名称冲突而导致错误。例如:

// code around validating user registration
function validate(username) {
  return /someValidationRegex/.test(username);
}
// do stuff with validate


// And then, far elsewhere in the code,
// you need to validate an input for sending to the server:
function validate(input) {
  return /someOtherValidationRegex/.test(input);
}
// do stuff with validate
这将不起作用,因为最后一个
validate
函数将覆盖第一个
validate
函数,代码将无法按预期工作

将每段代码放入IIFE,以避免名称冲突的可能性:

(() => {
  // code around validating user registration
  function validate(username) {
    return /someValidationRegex/.test(username);
  }
  // do stuff with validate
})();

(() => {
  // code around validating an input for sending to the server:
  function validate(input) {
    return /someOtherValidationRegex/.test(input);
  }
  // do stuff with validate
})();
这种技术(至少在某些方面)是有效的

使用IIFEs的另一个原因是,即使小心不要复制函数名,也可能会意外地复制窗口属性。例如,以下是人们经常遇到的一个bug:

//名称被定义为一个数字。。。
变量名=5;
//但它实际上是一根线???
console.log(名称类型)的共同优点是,内部定义的任何“函数或变量”都不能在块外部访问,从而防止全局范围受到污染

用于动态定义和执行函数,并在不需要额外代码的情况下当场使用它们

(函数(){
var firstName='Jhon';
console.log(名字);
})(); // 将被当场处决
功能测试(){
var firstName='Jhon';
console.log(名字);
}

test();//必须手动调用
您的意思是IIFE:立即调用的函数表达式?在模块之外,(几乎)每个脚本都应该在IIFE中关闭。