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