Javascript 改变功能范围
我正在尝试测试此模块:Javascript 改变功能范围,javascript,node.js,sinon,Javascript,Node.js,Sinon,我正在尝试测试此模块: function fa(){ return "function A" } function fb(){ return "function B + " + fa() } module.exports = {fa, fb} 我这样测试它: var myModule = require("./myModule") var sinon = require("sinon") var util = require('util'); sinon.stub(myMod
function fa(){
return "function A"
}
function fb(){
return "function B + " + fa()
}
module.exports = {fa, fb}
我这样测试它:
var myModule = require("./myModule")
var sinon = require("sinon")
var util = require('util');
sinon.stub(myModule,"fa").returns("stub")
console.log(myModule.fb()) //expect to display "function B + stub"
它实际上显示“功能B+功能A”
如果我将fb的方法体替换为返回“function B+”+this.fa()
(注意添加了this.
),那么它将按预期工作
有没有一种方法可以模拟一个没有用
this
调用的函数?没有简便的方法。您可以创建一个对象并将其用作引用,因此可以将该函数作为“方法”调用
发生的情况是,您正在调用该函数“as function”,该函数本身与您正在导出的函数不同
这篇文章可以进一步澄清我所说的话。
没有简便的方法可以做到这一点。您可以创建一个对象并将其用作引用,因此可以将该函数作为“方法”调用 发生的情况是,您正在调用该函数“as function”,该函数本身与您正在导出的函数不同 这篇文章可以进一步澄清我所说的话。
嗯,很抱歉,它不仅没有回答我的问题,而且我相信它也不正确。我导出的函数与其源函数完全相同。问题在于如何通过this引用或本地范围解决fa。我知道如何处理这个,但我不知道如何更改函数范围。通过
bind
或使用with
关键字绑定新上下文都不起作用。你是对的,这是相同的功能。但是,当您为myModule.fa进行模拟时,“fa”函数属于myModule对象。当您调用myModule.fb()时,“fa”函数不属于myModule对象,因为您将其作为函数调用,因为您不需要面对这些引用问题,并且不使用'this'关键字,我通常编写如下代码:var exportObject={};exportObject.fa=函数fa(){return'函数A';};exportObject.fb=函数fb(){return'函数B+'+exportObject.fa();};module.exports=导出对象;嗯,我很抱歉,但它不仅没有回答我的问题,我相信它也是不正确的。我导出的函数与其源函数完全相同。问题在于如何通过this引用或本地范围解决fa。我知道如何处理这个,但我不知道如何更改函数范围。通过bind
或使用with
关键字绑定新上下文都不起作用。你是对的,这是相同的功能。但是,当您为myModule.fa进行模拟时,“fa”函数属于myModule对象。当您调用myModule.fb()时,“fa”函数不属于myModule对象,因为您将其作为函数调用,因为您不需要面对这些引用问题,并且不使用'this'关键字,我通常编写如下代码:var exportObject={};exportObject.fa=函数fa(){return'函数A';};exportObject.fb=函数fb(){return'函数B+'+exportObject.fa();};module.exports=导出对象;