在一个函数中,返回另一个函数的目的是什么? (JavaScript)的

时间:2014-08-21 04:54:59

标签: javascript

我在一个练习中查看了这段代码,该练习在函数中返回另一个函数:

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

有人可以解释一下第一种方法有什么意义吗?如果使用第一种和第二种方法之间有什么区别吗?

谢谢!

5 个答案:

答案 0 :(得分:1)

第二种方法每次都重新创建names数组 - 只是为了索引它并将数组本身和其中的大部分字符串抛出去。

第一个方法,称为闭包,只创建names一次(当最初调用外部函数时)。内部函数保留对其所有封闭范围的引用,因此可以访问names

答案 1 :(得分:1)

第一个选项在代码首次初始化时执行外部函数(通过定义末尾的())并将内部函数赋给变量dayName。这会将相同的函数逻辑放入dayName符号中,但第一个选项允许数组names存在于闭包内。这种关闭具有以下优点:

  1. 该数组仅在启动时评估一次,而不是每次调用该函数时(在第二个选项中都会发生)。
  2. 数组名称位于私有命名空间中,并且不会向全局命名空间添加任何内容(如果将数组移到函数外部以便仅对其进行一次评估,则会发生这种情况。)
  3. 该功能只能由该功能访问或修改,不能从功能外部访问,因此更具防篡改功能。
  4. 可以以持久方式(从函数内)修改数组,该方式将从一个函数调用持续到下一个函数调用。在这种情况下没有这样做,但可以是这种设计模式的优点。您还可以向闭包添加其他变量,这些变量同样会从一个函数调用持续到下一个函数调用。除非在函数外部创建全局变量,否则在第二个选项中不可能这样做。
  5. 因此,返回该功能可以让您获得两全其美的效果。第一个选项的唯一缺点是函数名称没有被提升到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