0

编辑:我想更好地了解内部函数如何“获取”传递给函数的附加参数。(例如,函数需要一个参数,我们给它三个参数。另外两个到哪里去?)。为了这个问题,我想避免使用 arguments 对象。

我希望能更好地理解可选参数如何“落入”内部函数。我将使用下面的代码作为示例:

function outside() {
   var x = 10;
   function inside(x) {
      return x;
   }
   function inside2(a) {
      return a;
   }
   return inside2; // or inside, doesn't seem to make a difference here
}
outside()(20,5)

不管 outside() 返回 inside2 还是 inside1,总是返回数字 20。有没有办法为其他内部功能利用额外的输入?

例如,像这样的东西(无效代码):

function outside() {
   var x = 10;
   function inside(x) {
      return x;
   }
   function inside2(a) {
      return inside();
   }
   return inside2;
}
outside()(20,5)
4

4 回答 4

3

我认为你在理解 JS 中的函数、变量和参数如何工作方面存在一个基本问题。我将解释您的代码,希望能启发您:

function outside() {
   var x = 10; // variable x is a local variable in the scope of the outside function. it is not used anywhere
   function inside(x) { 
      // parameter x hides the variable in the outer scope (outside) with the same name 

      // this function returns the first parameter passed to it. 
      // what the value returned is will be decided when the function is called
      return x;
   }
   function inside2(a) {
      // this function also returns the first parameter passed to it.
      return a;
   }
   return inside2; // or inside, doesn't seem to make a difference here
   // no difference because both functions do the same thing
}
outside()(20,5) // this code is equivalent to the following lines:

var temp = outside();  // temp is the return value of outside - in our case the inside2 function
temp(20,5); // the inside2 function is called with 2 arguments. It returns the first one (20) and ignores the other one

如果你想更好地解释你想用你的代码实现什么,请这样做,我会帮助你做到这一点。同时,一些来自 MDN 的函数和范围的阅读: https ://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope

编辑:经过一番猜测,我想也许你可能想做这样的事情:

function outside(x,a) {
  function inside1() {
    return x; // returns the x from the outer scope = the first parameter passed to outside
  }
  function inside2() {
    return a; // returns the a from the outer scope = the second parameter passed to outside
  }
  return inside2;
}

outside(20,5)() // returns 5

一个 JsBin,所以你可以摆弄它:http: //jsbin.com/oKAroQI/1/edit

于 2013-09-25T16:09:19.020 回答
0

通过连续检查父作用域中的变量来解析变量,直到达到全局作用域。

在您的第二个示例中,何时inside从变量中调用inside2x已定义,尽管它的值未定义。由于运行时 cam 在其函数范围内查找变量,inside因此不会尝试从outside全局范围或全局范围中获取值。

您可以重命名外部变量,然后执行以下操作:

default_x = 10;
function inside(x){
    x = x || default_x; // Return argument x if it's value is truthy, otherwise use default
    return x
} 
于 2013-09-25T15:54:46.313 回答
0

我认为您正在寻找arguments变量。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments

var someFunc = function(arg1) {
  console.log(arguments[1]); //logs 'second arg'
  console.log(arguments.length); //logs 2
};

someFunc('first arg','second arg');

编辑

很难准确理解您在这里的意思,但我认为您可能对以下内容感兴趣:

function outside() {
   var x = 10;
   function inside(x) {
      return x;
   }
   function inside2(a) {
      if(arguments.length == 2) {
        //return the 'inside' function with the second parameter
        return inside(arguments[1]);
      } 

      return a;
   }
   return inside2;
}
outside()(20,5)
于 2013-09-25T15:54:27.967 回答
0

您在外面的函数正在返回一个函数。这两个函数都是相同的,因此它们都返回相同的东西也就不足为奇了。我认为您期望在内部返回 x 值作为闭包的一部分。问题是您已经定义了一个具有相同变量名称的函数级变量,使其有效地覆盖了闭包值。将内部变量名的名称更改为其他名称,我想你会看到你所期望的。

于 2013-09-25T15:55:55.167 回答