2017-01-02 15 views
1

スタブされたネストされた関数を呼び出そうとしています。 私はスタブにsinonを使用しています。Javascript - ネストされた関数がスタブされた関数を呼び出さない

function logger(){ 

    function log(msg){ 

     sendMsg(msg) 
    } 

    var sendMsg = function (msg){ 
     console.log("original func") 
    } 

    return { 
     log:log, 
     sendMsg:sendMsg 
    } 
} 

私は「SENDMSG」FUNCをスタブとlog関数からそれを呼び出すしようとしているが、代わりにstubed機能の、オリジナルのものが呼び出されています。

私がsendMsgthis.sendMsgと呼ぶと、最も奇妙なことはスタブを呼び出すことです。

イリノイ、認識していないJS原則イムは、あなたがいずれかに私を指すことができ喜んであることを確認イム..

おかげ

+1

JavaScriptに暗黙の 'this'はありません。したがって、 'sendMsg()'と 'this.sendMsg()'は同じことを意味するものではありません。 –

答えて

3

log()関数は、関数を呼び出すために、シンボルsendMsgを直接参照します。 sendMsglog()にしか表示されず、「実際」の関数が割り当てられているローカル変数です。その返されたオブジェクトの "sendMsg"プロパティの値を変更してもそれには影響しません。 log()いつもは、 "実際の" sendMsg()関数を呼び出します。

this.sendMsgを呼び出すようにlog()が書き込まれた場合は、スタブ関数が呼び出されます。

+0

ありがとう、しかし、私はその背後にあるロジックが何であるか知りたいです – yuria

+0

@yuria "論理"?それが言語の仕組みです。何らかのオブジェクトが変更されただけで 'sendMsg()'が直接呼び出されるのはなぜですか? 'log()'のコードは 'this'を全く使わないので、外部関数から返されたオブジェクトはそのコードの動作に特別な影響を与えません。 – Pointy

+0

しかし、 'log()'のコードで 'this'が使われているのはなぜですか? – yuria

関連する問題