【问题标题】:Javascript - Nested function doesn't call stubbed functionJavascript - 嵌套函数不调用存根函数
【发布时间】:2017-01-02 15:04:32
【问题描述】:

我试图调用一个被存根的嵌套函数。 我正在使用 sinon 进行存根。

function logger(){

    function log(msg){

       sendMsg(msg)
    }

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

    return {
        log:log,
        sendMsg:sendMsg
    }
}

我正在存根 'sendMsg' 函数并尝试从 log 函数调用它,但不是存根函数,而是调用原始函数。

最奇怪的是,当我用this.sendMsg 调用sendMsg 时,它调用了存根。

我确定有一个我不知道的 JS 原理,我很高兴你能指出一个..

谢谢

【问题讨论】:

  • JavaScript 中没有隐式的this。因此sendMsg()this.sendMsg() 不是同一个意思。

标签: javascript


【解决方案1】:

log()函数直接引用符号sendMsg来调用函数。 log() 唯一可见的 sendMsg 是分配了“真实”函数的局部变量。更改该返回对象的“sendMsg”属性的值不会影响它; log()总是调用“真实的”sendMsg() 函数。

如果 log() 被编写为调用 this.sendMsg,那么您的存根函数将被调用。

【讨论】:

  • 谢谢,但我想知道这背后的逻辑是什么
  • @yuria 的“逻辑”?这就是语言的工作方式。为什么直接调用sendMsg() 会因为某些对象发生变化而发生变化?外部函数返回的对象对该代码的工作方式没有任何特殊影响,因为log() 中的代码根本没有使用this
  • 但是如果log() 中的代码确实使用了this 为什么它的工作方式不同?
  • @yuria 因为this 的值取决于函数的调用方式。如果您从外部函数返回的对象调用object.log("hello"),那么this 的值将是对该对象的引用。因为您已经用存根替换了“sendMsg”属性值,所以将调用存根。相比之下,对sendMsg()直接 引用与返回的对象无关。