【发布时间】:2016-12-19 18:31:58
【问题描述】:
根据闭包概念,它将存储外部词法环境的变量,以供将来执行其内部函数。例如:
function makeYounger(age) {
function b() {
console.log("Original age is :" + age);
}
b();
return(function() {
return age / 2;
});
}
var displayAge = makeYounger(20);
console.log(displayAge());
在上述场景中,age 被 Javascript 引擎保存,以执行返回方法中存在的内部函数。
IIFE 来了:
(function(window) {
var greeting = "Hello";
var fNameSpace1 = {
name : "Appu",
callName : function() {
console.log(greeting + fNameSpace1.name);
}
};
window.doer = fNameSpace1;
}) (window);
fNameSpace1.callName(); //To execute the inner function
在上述场景中,根据闭包概念,变量greeting 和fNameSpace1.name 将被存储以供将来执行callname() 函数。相反,我们正在使用window 对象。我很困惑,如果我们有闭包,为什么我们要使用window?
【问题讨论】:
-
最后那个
fNameSpace1.callName();会失败。全局称为doer,而不是fNameSpace1。 -
不清楚你在问什么。如果问题是“闭包和 IIFE 之间有什么区别”,那么答案是“IIFE 是创建闭包的一种特定方式”。如果问题是“如果我们关闭,为什么我们要使用窗口?”答案是:因为作者想要一个全局变量。
-
我的问题是如果javascript引擎已经存储了fNameSpace1对象,那么window对象在这种情况下的确切用途是什么。为什么我们要使用window创建引用?
标签: javascript closures iife