Javascript 生活如何';有人呼吁立即阻止它污染全球范围吗?

Javascript 生活如何';有人呼吁立即阻止它污染全球范围吗?,javascript,scope,iife,revealing-module-pattern,Javascript,Scope,Iife,Revealing Module Pattern,在关于立即调用函数表达式(关于提供的代码段)的Udacity课程中,它说: 返回的函数关闭(即捕获) 嗨,变量。这允许myFunction维护一个私有的、可变的 无法在函数外部访问的状态!另外: 由于立即调用所表示的函数,IIFE 很好地升级代码,这样我们就不会污染全局范围 我很难理解立即调用匿名函数与防止变量hi污染全局范围有什么关系,既然hi已经在函数中定义了,它不是已经在本地/私有范围中了吗 const myFunction = ( function () { const hi

在关于立即调用函数表达式(关于提供的代码段)的Udacity课程中,它说:

返回的函数关闭(即捕获) 嗨,变量。这允许myFunction维护一个私有的、可变的 无法在函数外部访问的状态!另外: 由于立即调用所表示的函数,IIFE 很好地升级代码,这样我们就不会污染全局范围

我很难理解立即调用匿名函数与防止变量
hi
污染全局范围有什么关系,既然
hi
已经在函数中定义了,它不是已经在本地/私有范围中了吗

const myFunction = (
  function () {
    const hi = 'Hi!';
    return function () {
      console.log(hi);
    }
  }
)();
一个生命如何被称为立即防止它污染全球范围

没有

作为一个函数,它停止了对全局范围的污染


函数中声明的变量只存在于该函数中

在现代JavaScript中,您有
let
和block作用域(我非常确定
const
也有block作用域),所以您可以这样做:

let myFunction;
{
    let hi = 'Hi!';
    myFunction = function () {
        console.log(hi);
    };
}
这将创建
myFunction
,而不会将
hi
泄漏到周围范围

在传统JavaScript中,只有
var
和函数作用域,您可以这样做:

var myFunction;
function a_private_scope() {
    var hi = 'Hi!';
    myFunction = function () {
        console.log(hi);
    };
}
a_private_scope();
a_private_scope
限制了
hi
的范围,但是(它是一个函数声明)它需要显式调用,并且我们仍然会向周围的范围泄漏一个名称(这次它是
a_private_scope
,函数作为作用域的名称)

通过使用函数表达式并立即调用它,我们避免了第二个名称的污染:

var myFunction;
(function () {
    var hi = 'Hi!';
    myFunction = function () {
        console.log(hi);
    };
})();
现在,外部范围中定义的唯一内容是
myFunction
。充当
hi
作用域的匿名函数没有名称,它可能会污染周围的作用域

最后,我们可以使用返回值对其进行一些清理,因此我们不必两次提到
myFunction

var myFunction = function () {
    var hi = 'Hi!';
    return function () {
        console.log(hi);
    };
}();

(这也为我们节省了一对
,因为
函数
关键字不再出现在语句的开头。)

关键是要避免从全局范围访问
hi
,并创建另一个不会与之冲突的名称。如果不立即调用它,则必须给它一个名称,从而污染外部范围。基本上
myFunction=function(){console.log(hi)}
因为这是iife的结果,但如果不使用iife,则必须在外部范围内声明
hi
。如果你在最高范围内这样做,你的
hi
对象或
global
对象(取决于你拥有的)就会被污染。只要一个变量在一个块(在let或const的情况下)或函数(在car的情况下)内,它就不会污染全局范围。他们为什么需要iife?我们可以用普通函数吗?为什么说生活可以防止全球范围的污染?你不需要生活。您可以使用一个普通函数(但是您必须在某个时候调用它,为什么不立即调用呢?)。再看一下答案的最后两句,每个人都知道!关键不是这样!重点是,IIFE的优点之一是它们不会污染全球范围!你们怎么看不出有什么不同!为什么他们会这样做,当它发生在正常功能也!唯一的区别是,不用写“function functname(){whatever;}funcName();”而是写“(function(){whatever;})();”,这样可以避免留下funcName。这是一件很小的事情,但是在一个有很多单用函数的大型项目中,它可能会保护您免受意外的函数名重用。