使用和不使用闭包创建私有变量
Creating Private Variables with and without Closures
最近一直在努力学习JavaScript中的私有变量和闭包。我刚刚了解了 IIFE 以及它们如何与闭包一起使用来创建“私有”变量和函数。下面是我理解的一个例子。
let test = (function() {
let name = "";
let getName = function() {
return name;
}
let setName = function(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
})();
test.setName("Bob");
test.getName(); // "Bob"
test.name; // undefined
然而,这让我想知道,为什么我不能用一个正则函数表达式来完成这个,然后调用该表达式,然后将它保存到一个变量中。这个新变量也将有一个私有名称值。例如:
let test2 = function() {
let name = "";
let getName = function() {
return name;
}
let setName = function(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
}
let test3 = test2();
test3.setName("Bob");
test3.getName(); // "Bob"
test3.name; // undefined
IIFE 方法与定义后立即调用的正则函数表达式相比有什么好处吗?
谢谢!
好处是 IIFE 只是一个表达式。没有对封闭的命名空间进行任何更改(好吧,至少不是由 IIFE 本身直接进行)。当您需要一个作用域来完成某些工作,但您所处的上下文只允许一个表达式时,它很有用。 IIFE 可以是任何东西,也许是一个完整的程序,但它 returns 封闭上下文的单个值(例如对象初始化器)。
这两个代码是等价的,但是第二个版本创建了一个不必要的全局变量test2
(假设这是顶级代码)。
IIFE 有点像顶级版本的匿名函数 -- 当您只需要在一个地方使用代码时使用它们,因此不需要给它一个永久的名称。
最近一直在努力学习JavaScript中的私有变量和闭包。我刚刚了解了 IIFE 以及它们如何与闭包一起使用来创建“私有”变量和函数。下面是我理解的一个例子。
let test = (function() {
let name = "";
let getName = function() {
return name;
}
let setName = function(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
})();
test.setName("Bob");
test.getName(); // "Bob"
test.name; // undefined
然而,这让我想知道,为什么我不能用一个正则函数表达式来完成这个,然后调用该表达式,然后将它保存到一个变量中。这个新变量也将有一个私有名称值。例如:
let test2 = function() {
let name = "";
let getName = function() {
return name;
}
let setName = function(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
}
let test3 = test2();
test3.setName("Bob");
test3.getName(); // "Bob"
test3.name; // undefined
IIFE 方法与定义后立即调用的正则函数表达式相比有什么好处吗?
谢谢!
好处是 IIFE 只是一个表达式。没有对封闭的命名空间进行任何更改(好吧,至少不是由 IIFE 本身直接进行)。当您需要一个作用域来完成某些工作,但您所处的上下文只允许一个表达式时,它很有用。 IIFE 可以是任何东西,也许是一个完整的程序,但它 returns 封闭上下文的单个值(例如对象初始化器)。
这两个代码是等价的,但是第二个版本创建了一个不必要的全局变量test2
(假设这是顶级代码)。
IIFE 有点像顶级版本的匿名函数 -- 当您只需要在一个地方使用代码时使用它们,因此不需要给它一个永久的名称。