我在一个练习中查看了这段代码,该练习在函数中返回另一个函数:
var dayName = function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
return function(number) {
return names[number];
};
}();
console.log(dayName(3));
// → Wednesday
但是,即使我没有返回其他功能,这个替代代码也可以使用:
var dayName = function(number) {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
return names[number];
};
console.log(dayName(3));
// → Wednesday
有人可以解释一下第一种方法有什么意义吗?如果使用第一种和第二种方法之间有什么区别吗?
谢谢!
答案 0 :(得分:1)
第二种方法每次都重新创建names
数组 - 只是为了索引它并将数组本身和其中的大部分字符串抛出去。
第一个方法,称为闭包,只创建names
一次(当最初调用外部函数时)。内部函数保留对其所有封闭范围的引用,因此可以访问names
。
答案 1 :(得分:1)
第一个选项在代码首次初始化时执行外部函数(通过定义末尾的()
)并将内部函数赋给变量dayName
。这会将相同的函数逻辑放入dayName
符号中,但第一个选项允许数组names
存在于闭包内。这种关闭具有以下优点:
因此,返回该功能可以让您获得两全其美的效果。第一个选项的唯一缺点是函数名称没有被提升到JS文件的顶部,就像静态函数声明一样,因此在执行此代码之前它不可用。这通常不是一个重要问题,但它确实要求您对代码定义序列与启动代码中的使用情况稍微小心。
答案 2 :(得分:0)
第一个版本只定义names
一次(并且不会用它污染全局命名空间)。每次调用names
时,第二个版本都会定义dayName
。
答案 3 :(得分:0)
第一个选项
var dayName = function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
return function(number) {
return names[number];
};
}();//<-- anonymous function already invoked, so now dayName has the reference of inner function along with the array created.
console.log(dayName);//<-- prints, function (number) { return names[number]; }
console.log(dayName(1));//<-- prints, Monday
未调用匿名函数
var dayName = function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
return function(number) {
return names[number];
};
};//<-- anonymous function not invoked
console.log(dayName()(1));//<-- prints, Monday
第二个选项
var dayName = function(number) {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
return names[number];//<-- returns the array element for given parameter index
};//<-- not invoked
console.log(dayName(1));//<-- prints, Monday
答案 4 :(得分:0)
这是javascript实现数据隐藏和封装的方式。第一个代码段中的names
变量变为一个变量,只能由您返回的特权函数访问。 / p>
return function(number) { // this is the privileged function
return names[number];
};
如果没有特权功能的帮助,你无法直接访问这些名称。这个概念在javascript中被称为closures