在一个函数中,返回另一个函数的目的是什么?(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];   
      };