2017-05-02 4 views
3

test1とtest2という2つの関数があるとします。関数を返すときにJavascriptでクロージャはどのように機能しますか?

test1 = function(name){ 
    console.log('Hi, ', name); 
}; 

test2 = function(name) { 
    var text = 'Hello ' + name; 
    var say = function() { console.log(text); } 
    return say; 
} 

今、私は正確にここで何が起こっている

var t1 = test1('John'); 
var t2 = test2('John'); 

、関数を呼び出してVARSに保存しますか?

+0

'test1'は関数を実行し、' 'Hi John'と' return undefined'を出力します。 't1'は' undefined'になります。 'test2'は、' text'上のクロージャを持つ新しい 'function'を返し、それを' t2'に代入します。 't2'は新しい' function'になりました。あなたはまだ完成していない出力を得るためにそれを実行する必要があります。 – JohanP

+0

't2();のように呼び出すことができると思います。 – AminFarajzadeh

答えて

2

このを理解することができますコンソールにログインしないように呼ばれることはありません機能が含まれている、関数を返しますtest1( 'John')を使用している場合。

test2 = function(name) { 
    var text = 'Hello ' + name; 
    var say = function() { console.log(text); } 
    return say; 
} 
  • var text = 'Hello ' + name; //が// text
  • var say = function() { console.log(text); }という変数が関数をdefininga定義:あなたはtest2という関数を定義しているの下に

    test1 = function(name){ 
        console.log('Hi, ', name); 
    }; 
    

    は今、コードの下に理解することができますsayと呼ばれ、コンソールの変数textにデータを記録します。

  • 次に、say関数を返します。

OUTPUT:
入力:=>var t1 = test1('John');
出力:=>Hi, John //これはかなりまっすぐ進むのです。

入力:=>var t2 = test2('John');
出力:ここ=>undefined //あなたは、再割り当て機能がt2からsaytest2から返されます。したがって、t2と入力すると、sayと似た出力としてfunction() { console.log(text); }が出力されます。

ご迷惑をおかけして申し訳ございません。

1

呼び出しでは、test2は関数のポインタである 'say'を返しますが、値は返しません。それが何も出力しない理由です。 関数 'say'を呼び出すには、test2('john')()を実行する必要があります。 括弧の2番目のペアでは、内部の関数に引数を渡します。

2

あなたの機能のボイドtest1戻り、コンソールとt2に保存するに機能say()を返すtest2return声明 この機能プリントHi John

コンソールへのあなたの機能がないので。これにより、 t2が機能します。 test2の構文に注意を払うと、それはjavascriptで関数を定義する2つの標準的な方法の1つです。あなたは

t2(); を呼び出す場合は、test1('John');のような出力が得られます:

Hello John

+0

良いと完全な答え! 1つの小さな間違いが見つかりました.t2()は "Hello John"を、test1( 'John')は "Hi、John"を表示します。しかし、それは技術的理解のためには重要ではない。 – Matt

1

あなたの最初の関数は、コードを実行し、その後、t1は不定となります任意のものを返す `tを。あなたがHi, Johnを出力しますtest1という関数を定義している以下のコードで

:しかし、第二の機能は、t2は、それが

関連する問題