2017-01-22 1 views
1

ここでクロージャが機能しないのはなぜですか? createTreeText()関数は、呼び出された関数からテキスト変数を取ることになっていますか?私はそれをパラメータで渡すことができますが、なぜ閉鎖を通じてこれを行うことができないのですか?なぜこれらの機能で作業が終了しないのですか?

function createTree(){ 
    var text = "example"; 
    text = createTreeText(); 
    console.log(text); 
} 

function createTreeText(){ 
    var newText = text.toUpperCase(); // error happens here 
    return newText; 
} 

createTree(); 
+1

は、画像を使用していない、 "コード" としてあなたのコードを追加します。 –

+1

'text'をパラメータとして渡すのはなぜですか? –

+0

2番目の関数では、 'text'はunknow変数であると思われます。これは、最初の関数でのみ定義されているためです。 – kouty

答えて

0

テキストは、最初の機能の範囲内で定義されています。 2番目の関数にはまったく参照がありません。あなたはいくつかの方法がこの問題を解決することができますが、最も簡単なだけで、それをパラメータとして渡すことです:

function createTree(){ 
    var text = "example"; 
    text = createTreeText(text); 
    console.log(text); 
    } 

    function createTreeText(text){ 
    var newText = text.toUpperCase(); // error happens here 
    return newText; 
    } 
    createTree(); 
1

createTreeTextはクロージャではありません。 createTreeのスコープにアクセスすることはできません。

function createTree(){ 
    var createTreeText = function(){ 
     var newText = text.toUpperCase(); // error happens here 
     return newText; 
    } 
    var text = "example"; 
    text = createTreeText(); 
    console.log(text); 
    } 

    createTree(); 
5

は、それが

と呼ばれていた関数からテキスト変数を取ることになってcreateTreeText()関数ではありません:それはクロージャを使用して、あなたの例で動作させるために、あなたはこれを試みることができますいいえ、まったくありません。スコープ内の変数のうち、 が作成された関数は、であり、呼び出される場所ではありません。すべての関数は、呼び出された場所から取得した情報が引数として渡される情報です(呼び出される方法や機能の種類によっては、 thisなどがあります)。

この例では明らかに、コメント表示されることがあります。

function wrapper() { 
 
    var a = Math.random(); 
 
    
 
    function foo() { 
 
    // `foo` closes over `a`, because `a` is in scope 
 
    // where `foo` was created 
 
    console.log("a = " + a); 
 

 
    // `foo` does not close over `b`, because `b` is not in scope 
 
    // where `foo` was created 
 
    try { 
 
     console.log("b = " + b); // throws ReferenceError 
 
    } catch (e) { 
 
     console.log("error: " + String(e)); 
 
    } 
 
    } 
 
    
 
    function bar() { 
 
    var b = Math.random(); 
 
    // Calling `foo` here does nothing to grant it access to `b` 
 
    foo(); 
 
    } 
 
    
 
    bar(); 
 
} 
 

 
wrapper();

関連する問題