Javascript 如何重写函数而不是引用?

Javascript 如何重写函数而不是引用?,javascript,jasmine,Javascript,Jasmine,这是我保存在api中的基本自执行函数和私有函数。 我的问题是,现在我无法从函数外部覆盖deepCalculate 这是个什么问题?我使用Jasmine,想测试函数是否被调用。例如: var BigObject = (function() { function deepCalculate(a, b, c) { return a + b + c; } function calculate(x) { deepCalculate(x, x, x); } retu

这是我保存在
api
中的基本自执行函数和私有函数。 我的问题是,现在我无法从函数外部覆盖
deepCalculate

这是个什么问题?我使用
Jasmine
,想测试函数是否被调用。例如:

var BigObject = (function() {

  function deepCalculate(a, b, c) {
    return a + b + c;
  }

  function calculate(x) {
    deepCalculate(x, x, x);
  }

  return {
    calculate: calculate,
    api: {        
      deepCalculate: deepCalculate
    }
  }
})();
失败了。然而,当我调试时,我确信Jasmine将
BigObject.api.deepCalculate
绑定为间谍,但是从内部calculate仍然调用原始
deepCalculate
函数,而不是间谍


我想知道如何覆盖函数,而不仅仅是函数的引用。

简单的答案是:

spyOn(BigObject, 'calculate').andCallThrough();
expect(BigObject.api.deepCalculate).toHaveBeenCalled();
虽然我必须这么说,但我会认真考虑其他方法来实现你想做的事情。海事组织认为,关闭应作为一个整体来处理。随意地替换它的一部分将很快被证明是一场噩梦:你不知道在任何给定的时间点闭包函数是什么,它在哪里被更改,以前的状态是什么,以及它为什么被更改
临时解决方案可能是:

(function ()
{
    var overWriteMe = function(foo)
    {
        return foo++;
    },
    overWrite = function(newFunc)
    {
        for (var p io returnVal)
        {
            if (returnVal[p] === overWriteMe)
            {//update references
                returnVal[p] = newFunc;
                break;
            }
        }
        overWriteMe = newFunc;//overwrite closure reference
    },
    returnVal = {
        overWrite: overWrite,
        myFunc: overWriteMe
    };
}());

依我看,这要安全得多,因为它允许您选择一个不同的“内部”函数一次性使用,而不改变代码的核心行为。

您在最后一行缺少一个右大括号。是的,但这没有任何区别。这只是举个例子
var foo = (function()
{
    var calc = function(x, callback)
    {
        callback = callback || defaultCall;
        return callback.apply(this, [x]);
    },
    defaultCall(a)
    {
        return a*a+1;
    },
    return {calc: calc};
}());
foo(2);//returns 5
foo(2,function(x){ return --x;});//returns 1
foo(2);//returns 5 again