JS:使用传递给函数的参数作为嵌套函数的参数

我似乎找到了它:如何将一个被调用函数 directly 中的参数传递给嵌套函数?例如,从"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() 函数以及将第二个参数传递给嵌套函数的正确语法是什么,以及它如何在幕后工作?谢谢!

回答(4)

3 years ago

事物是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

请看一下:

UPDATE

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

3 years ago

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

因为它立刻被称为 .

如果您在函数结束时使用 (); ,那么's going to work how you'认为应该

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 years ago

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

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));

3 years ago

dayName函数是一个带有私有变量的闭包 . 您可以访问该数组var

return names[number];

内部功能 . 将Number传递给名称以声明要捕获的数组中的哪个值 .

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

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

names变量是私有的,只能由函数访问 . 所以返回名称进入函数并获取var以供使用 .

Your code.

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);

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

Your code.

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

dayName(outerFunctionParam, innerFunctionParam);