2017-10-30 4 views
0
var ag = (function(){ 
     function update(at){ 
      console.log('at::'+at); 
     } 
     return {hike:function(){update(2);}} 
})(); 

このメソッドでは、参照(ag.hike();)を通じて内部関数hike()にアクセスできます。上記の例ではIIFEの内部関数のプロパティを読み取ることができませんか?

var ag = (function(){ 
     function update(at){ 
      console.log('at::'+at); 
     } 
     return update(2); 
})(); 

私も参照介して同じ内側update()メソッド(ag.update(2)またはag.updateを())にアクセスすることができません。

私はIIFEの内部特性を読み取ることができないことを読んだ。しかし、最初のケースでは私はアクセスすることができ、2番目のケースではアクセスできません。

上記の2つの例の違いは何ですか? なぜこれらの2つの異なる動作ですか? 私を説明してください。私の英語には申し訳ありません。

+0

最初のスニペットでは、メソッドがあり、これはIIFEで閉じられているobjcetを返しています。 2番目のスニペットではクロージャはありません。IIFEはちょうど値を返します(実際には未定義です)。 – Teemu

+0

'関数の更新(at)'は未定義を返します。返す 'return update(2);' ...したがって 'ag === undefined' –

+0

ありがとうございますが、私はどこかの内部関数をクロージャにすることができます。だから私たちは閉鎖を通じてアクセスすることはできません。私が間違っている場合は申し訳ありません –

答えて

0

atの値を2にして後で呼び出す関数を返す場合は、bindを使用します。

return update.bind(null, 2); 

それはあなたのアプローチに問題がreturn update(2);をしながらすぐにupdate関数を呼び出すとupdate関数によって返された値を返していることである。この

ag();// at::2 

のように呼び出すことができる関数を返しますその関数内に何も返さないので、undefinedです。以下のスニペットで

+0

こんにちは@RanjithReddyKeesari、答えが有用かどうか、またはあなたが疑問を持っているかどうか私に知らせてください。 –

0

var ag = (function(){ 
    function update(at){ 
     console.log('at::'+at); 
    } 
    return { hike: function(){ update(2); } } 
})(); 

あなたは財産hikeその中update機能の参照を持つオブジェクトを、帰国しています。ここではhikeは関数なので呼び出し可能です。第二のスニペットで

var ag = (function(){ 
    function update(at){ 
     console.log('at::'+at); 
    } 
    return update(2); 
})(); 

あなたはupdate(2)の結果を返しているとupdate関数は何も返さないため、agはuncallableあるundefinedの値を、持っています。

updateの参照を返信し、2で呼び出すことができます。

var ag = (function(){ 
    function update(at){ 
     console.log('at::'+at); 
    } 
    return update; 
})(); 
ag(2) // at::2 
関連する問題