在一个函数中,返回另一个函数的目的是什么?(Javascript)
我在一个返回函数中另一个函数的练习中看到了这段代码:在一个函数中,返回另一个函数的目的是什么?(Javascript),javascript,Javascript,我在一个返回函数中另一个函数的练习中看到了这段代码: var dayName = function() { var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; return function(number) { return names[number]; }; }(); console.log(dayName(3))
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
有人能解释一下第一种方法的意义吗?使用第一种和第二种方法之间是否有任何区别
谢谢 第二种方法每次都会重新创建
名称
数组-只是为了索引到数组中,并将数组本身和其中的大部分字符串扔掉
第一个方法称为闭包,只创建一次
名称
(当外部函数最初被调用时)。内部函数保留对其所有封闭作用域的引用,因此可以访问名称
第一个版本只定义名称
一次(并且不会污染全局名称空间)。第二个版本将在每次调用dayName
时定义names
。第一个选项在代码首次初始化时执行外部函数(通过定义末尾的()
),并将内部函数分配给变量dayName
。这将在dayName
符号中获得相同的函数逻辑,但第一个选项允许数组names
位于闭包中。这种关闭方式有以下好处:
因此,返回函数将使您获得两个方面的最佳效果。第一个选项的唯一缺点是函数名不会像静态函数声明一样被提升到JS文件的顶部,因此在执行此代码之前它不可用。这通常不是一个重要的问题,但它确实要求您对代码定义的顺序与在启动代码中的使用稍微谨慎一点。第一个选项
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(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
var dayName=function(){
变量名称=[“星期日”、“星期一”、“星期二”、“星期三”,
“星期四”、“星期五”、“星期六”];
返回函数(编号){
返回名称[编号];
};
}();// 这就是javascript实现数据隐藏和封装的方式。第一个代码段中的名称
变量成为一个变量,只能由您返回的特权函数访问
return function(number) { // this is the privileged function
return names[number];
};
没有特权函数的帮助,您无法直接访问名称。此概念在javascript中调用
return function(number) { // this is the privileged function
return names[number];
};