在关于立即调用的函数表达式的Udacity课程中(关于提供的代码段),它说:
正在返回的函数关闭(即捕获) 您好变量。这允许myFunction维护私有的,可变的 状态无法在函数外部访问!更重要的是: 由于所表达的函数被立即调用,因此IIFE包装 很好地修改代码,以免污染全局范围。
我正在努力了解立即调用匿名函数与防止变量hi
“污染全局范围”有关,并且由于hi
已经在函数中定义了,它已经不在本地/私有范围内了吗?
const myFunction = (
function () {
const hi = 'Hi!';
return function () {
console.log(hi);
}
}
)();
答案 0 :(得分:1)
在现代JavaScript中,您具有let
和块作用域(而且我很确定const
也具有块作用域),因此您可以这样做:
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
的范围,但是(它是一个函数声明)它需要显式调用,并且我们仍然将名称泄漏给周围的范围(这次是{{1 }},即“服务范围”的名称。
通过使用函数 expression 并立即调用它,我们避免了这种二次污染:
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);
};
}();
(
,因为)
关键字不再出现在语句的开头。)
答案 1 :(得分:0)
如何立即调用IIFE防止其污染全球范围?
不是。
成为函数可以阻止它污染全局范围。
在函数内声明的变量仅存在于该函数内