2017-04-19 6 views
0

私は以前の質問Javascript understanding returnを更新したいと思っています。下のコードは以前のものと非常に似ていますが、その質問は既に回答済みですので、これを投稿することにしました。JavaScriptの復帰方法

function positionIdentifier(name, nameArray) { 
    var namePosition; 
    for (i = 0; i < nameArray.length; i++) { 
    if (nameArray[i] == name) { 
     namePosition = function() { 
     alert("Your name is in position number " + (i + 1)); 
     } 

    } 

    } 
return namePosition; 

} 

name1Array = ["look", "sky", "walk", "kier"]; 
positionIdentifier("walk", name1Array)(); 

は、なぜそれが間違った位置(i + 1)警告ん、私の以前の質問のコードはすでに正常に動作しますが、私は私の好奇心のいくつかは、私は、コードを実験し、リターンnamePositionを動かし満足したいですか?代わりに、配列の長さである最終位置を警告します。

+0

機能たらreturnが実行され、変数 'i'は配列の長さになります。これは複製であるため、ここでクロージャを参照してください。 Ps:ここに表示されている関数はすでに存在しています: 'name1Array.indexOf( 'walk')+1 ' – Shilly

答えて

0

私の友人は、javascriptでクロージャと呼ばれるものです。

function() { 
    alert("Your name is in position number " + (i + 1)); 
} 

positionIdentifier関数が呼び出され、iはは forループから最後の値を有します。あなたはここでは、この

function positionIdentifier(name, nameArray) { 
    var namePosition; 
    for (i = 0; i < nameArray.length; i++) { 
    if (nameArray[i] == name) { 

     /* now this will keep the correct value of i */ 
     namePosition = (function(i) { 
      return function(){ 
       alert("Your name is in position number " + (i + 1)); 
      } 
     })(i) 
     /* now this will keep the correct value of i */ 

    } 
    } 
    return namePosition; 
} 

を行う必要があり、この問題を解決するには

あなたがここにbreak文を使うのを忘れて作業フィドルhttps://jsfiddle.net/uxyot51b/

+0

配列内の1つの" i "を除くすべてが条件" if "を満たさないので、警告は保存されるべきです、なぜforループで変数iを継承しますか?クロージャーは本当に混乱しています。 –

+0

@MarkLemuelGenita:閉鎖は紛らわしいことではありません。それらをこのように考える。 関数内に関数がある場合、内部関数は作成された環境を記憶し、変数の値の参照を保持します。したがって、実行すると、 var innerFunc = positionIdentifier(); を実行してからinnerFunc() - >を実行すると、この関数は値を記憶し、実行のためにI-> last値の現在の値を保持します。 これが役立つことを願っています。それがあなたの問題を解決するならばアップアップしてください。 – mechanicals

+0

私の元の関数に戻って\、私は "forループ"ブロックの外にreturn namePositionを置くので、 "forループが完了した後にこの関数を実行する"という意味なのですか?ループ? –

0

は正しいコードです:

<script> 
     function positionIdentifier(name, nameArray) { 
      var namePosition; 
      for (i = 0; i < nameArray.length; i++) { 
       if (nameArray[i] == name) { 
        namePosition = function() { 
         alert("Your name is in position number " + (i + 1)); 
        }; 
        break; 
       } 

      } 
      return namePosition; 

     } 

     name1Array = ["look", "sky", "walk", "kier"]; 
     positionIdentifier("walk", name1Array)(); 
    </script> 
+0

休憩ステートメントを忘れて:)、元の関数に戻って、配列内の1つの "i"を除くすべてが条件 "if"を満たさないため、 "i "警告を保存する必要があります、なぜforループで変数iを継承しますか?クロージャーは本当に混乱しています。 –

関連する問題