【问题标题】:JS: Using an argument passed to a function directly as a parameter of a nested functionJS:使用传递给函数的参数直接作为嵌套函数的参数
【发布时间】:2016-06-21 20:55:39
【问题描述】:

我已经搜索了这个问题,但似乎找不到它:如何将被调用函数中的参数直接传递给嵌套函数?比如下面的代码,来自"Eloquent Javascript:"

var dayName = function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return function(number) {
    return names[number];
  };
}();

console.log(dayName(3));
// → Wednesday

参数3 被传递给dayName(),但dayName() 不直接接受任何参数。参数如何传递给嵌套的返回函数?嵌套函数本身没有返回,而是返回了一个值,这有什么不同?

最后,考虑这个伪代码,其中两个参数传递给dayName() 函数,dayName() 函数及其嵌套函数都接受参数:

var dayName = function(param) {
  console.log(param);
  (function(otherParam) {
    console.log(otherParam);
  });
};

dayName(outerFunctionParam, innerFunctionParam);

将一个参数传递给dayName() 函数并将第二个参数传递给嵌套函数的正确语法是什么,它在幕后是如何工作的?谢谢!

【问题讨论】:

  • @Tushar:虽然我的问题和我的问题都指向那本书中的同一段代码,但我们提出了两个非常不同的问题。
  • 分配给dayName的函数是IIFE,它返回另一个函数dayname = 内部函数 + 外部函数变量
  • 如果你理解了代码的工作原理,你的问题就会迎刃而解。 :)
  • @Tushar:谢谢,我会花一些时间来解决另一个问题,看看是否能解决我的问题 :)

标签: javascript scope arguments parameter-passing nested-function


【解决方案1】:

事情是在 dayName 分配结束时的括号。当 dayName 被分配到最后的括号时,这个返回的函数被分配给 dayName,而不是外部函数本身。

var a = function ( ) { 
    return 1;
}

var b = a; // the function a is assigned to b
var b = a(); // the function is executed hence the value returned by a is stored in b. That is 1

请看一下:

更新

var dayName = function(param1, param2) {
  console.log('param 1: ' + param1);
  (function(otherParam) {
    console.log('param 2: '+otherParam);
  })(param2);
};

dayName(1); // 1, undefined
dayName(1,2); // 1,2

【讨论】:

  • 我以为我理解 IIFE 的,但这是一个“啊哈”的时刻。更新也很有帮助,谢谢。请注意,您的更新代码没有按照编写的那样工作,所以我更正了它:)
【解决方案2】:

这是一个很好的问题!这取决于 dayName 函数是立即调用函数表达式 (IFFE) 的事实

因为它立即被调用。

如果您在函数末尾使用();,就像这样,它将按照您的想法工作

var dayName = function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
           "Thursday", "Friday", "Saturday"];
  return function(number) {
  return names[number];
  };
}(); // take that '()' out and this function will just return a function
     // with it on, it Immediately calls the function, returning 'Wednesday'

工作 JSBin:https://jsbin.com/zenajed/1/edit?js,console

【讨论】:

    【解决方案3】:

    如果我们在没有匿名函数的情况下重写示例,将如下所示:

    var theAnonymousFunction = function() {
      var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
                   "Thursday", "Friday", "Saturday"];
      return function(number) {
        return names[number];
      };
    }; // no () here
    
    var dayName = theAnonymousFunction();// call the anonymouse function to get a function(number) as returned object
    
    console.log(dayName(3));
    

    【讨论】:

      【解决方案4】:

      dayName 函数是一个带有私有变量的闭包。您通过

      访问该数组变量
      return names[number];
      

      的内部函数。将数字传递到名称中以声明要抓取数组中的哪个值。

      本质上这就是正在发生的事情

      var dayName = function(number) {
          return names[number];
        };
      

      names 变量是私有的,只能被函数访问。因此,返回名称进入函数并获取该 var 以供使用。

      您的代码。

      var dayName = function() {
        var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
                     "Thursday", "Friday", "Saturday"];
        return function(number) {
          return names[number];
        };
      }();
      

      第二个问题…………

      具有多个参数的 dayName 函数将只使用第一个参数,因为第二个参数从未在函数中声明。你会得到一个未定义的错误。

      var dayName = function(param, otherParamNeedsToBeDeFinedHere) {
      

      参数是在函数中声明和使用的变量。您可以创建尽可能多的内容,但不必在代码中全部使用它们。

      dayName(2);
      // and
      dayName(2,4);
      

      如果函数至少有两个参数,两者都可以工作。

      您的代码。

      var dayName = function(param) {
        console.log(param);
        (function(otherParam) {
          console.log(otherParam);
        });
      };
      
      dayName(outerFunctionParam, innerFunctionParam);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        相关资源
        最近更新 更多