Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 改变功能范围_Javascript_Node.js_Sinon - Fatal编程技术网

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=导出对象;