2017-01-02 4 views
1

Ich versuche eine verschachtelte Funktion aufzurufen, die stubbed ist. Ich benutze Sinon zum Stubbing.Javascript - geschachtelte Funktion ruft keine Stub-Funktion auf

function logger(){ 

    function log(msg){ 

     sendMsg(msg) 
    } 

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

    return { 
     log:log, 
     sendMsg:sendMsg 
    } 
} 

Ich stubbing die func ‚sendMsg‘ und versuchen, es aus log Funktion aufzurufen, sondern der stubed Funktion wird das Original genannt.

Die seltsamste Sache ist, dass, wenn ich sendMsg mit this.sendMsg rufe es den Stub aufruft.

Ich bin sicher, es ist ein JS Prinzip im nicht bewusst, Ill froh sein, dass du mich ein ..

Dank

+1

Es gibt kein implizites 'this' in JavaScript. Daher bedeuten 'sendMsg()' und 'this.sendMsg()' nicht dasselbe. –

Antwort

3

Die log() Funktion auf das Symbol bezieht sich direkt sendMsg um die Funktion aufzurufen verweisen. Die einzige sendMsg sichtbare bis log() ist die lokale Variable, der die "echte" Funktion zugewiesen ist. Das Ändern des Werts der "sendMsg" -Eigenschaft für das zurückgegebene Objekt kann dies nicht beeinflussen; log() wird immer rufen Sie die "echte" sendMsg() Funktion.

Wenn log() geschrieben wurden, um stattdessen this.sendMsg aufzurufen, dann würde Ihre Stub-Funktion aufgerufen werden.

+0

danke, aber ich würde gerne wissen, was ist die Logik dahinter – yuria

+0

@yuria die "Logik"? So funktioniert die Sprache. Warum sollte dieser Aufruf direkt zu 'sendMsg()' geändert werden, nur weil sich ein Objekt geändert hat? Das zurückgegebene Objekt von der äußeren Funktion hat keinen besonderen Einfluss darauf, wie dieser Code funktioniert, da der Code in 'log()' '' 'überhaupt nicht verwendet. – Pointy

+0

aber wenn der Code in 'log()' '' 'verwendet, warum funktioniert das anders? – yuria

Verwandte Themen