0

Edit: I want to better understand how internal functions 'take' the additional arguments passed to a function. (E.g. the function requires one argument and we give it three. Where do the other two go?). For the sake of this question, I want to avoid using the arguments object.

I am hoping to gain a better understanding of how optional arguments 'fall through' to internal functions. I'll use the code below as an example:

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)

Regardless of whether outside() returns inside2 or inside1, the number 20 is always returned. Is there any way to utilize additional inputs for the other internal functions?

For example, something like this (invalid code):

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

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

変数は、グローバル スコープに到達するまで、親スコープ内の変数を連続してチェックすることによって解決されます。

2番目の例では、変数inside内から呼び出されたときはすでに定義されていますが、値は未定義です。ランタイム カムは関数スコープ内の変数を見つけるため、グローバル スコープから値を取得しようとしません。inside2xinsideoutside

外部変数の名前を変更してから、次のようにすることができます。

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

外部の関数が関数を返しています。これらの関数は両方とも同一であるため、両方が同じものを返すことは驚くべきことではありません。クロージャの一部として内部で x 値を返すことを期待していると思います。問題は、関数レベルの変数を同じ変数名で定義して、クロージャー値を効果的にオーバーライドしていることです。内部の変数名を別の名前に変更すると、期待どおりになると思います。

于 2013-09-25T15:55:55.167 に答える