为什么这段代码会导致无限循环/递归

时间:2017-03-03 07:03:00

标签: javascript

我有以下javascript代码:

var original_selectCallback = window.selectCallback;
var selectCallback = function(variant, selector) {
  original_selectCallback(variant, selector);
  console.log(variant + " " + selector);
};

不知何故,第二行:

var selectCallback = function(variant, selector) 

导致对selectCallback的递归调用。我的理解是我正在重新定义selectCallback函数。那么为什么这是一个递归调用呢? 任何建议/意见表示赞赏。

3 个答案:

答案 0 :(得分:1)

您发布的代码没有任何内在错误:



var selectCallback = function() { console.log('original'); };
var original_selectCallback = selectCallback;
var selectCallback = function() {
 original_selectCallback();
 console.log('wrapper');
};
selectCallback();




错误可能出现在window.selectCallback的初始定义中,此处未显示。

答案 1 :(得分:1)

这里没有递归,很容易证明:

let someFn = function () { console.log('original'); };
let originalSomeFn = someFn;

someFn = function () {
  originalSomeFn();
  console.log('decorated');
};

someFn();

但是,原始函数可能涉及到某处的递归算法,而您的包装函数可能无法完全满足原始函数的正确行为契约。

要确保您应该如何包装原始功能。我还选择了一个闭包来避免全局originalSomeFn变量。

let someFn = function () {
    console.log('original');
    return 1;
};

someFn = (function (originalSomeFn) {
  return function () {
    let result = originalSomeFn.apply(this, arguments);

    console.log('decorated');

    return result;
  };
})(someFn);

console.log(someFn());

答案 2 :(得分:-1)

让我们检查您的代码:

var original_selectCallback = window.selectCallback;

创建引用函数selectCallback的新变量。

var selectCallback = function(variant, selector) {

创建window.selectCallback函数(因为它位于window范围内)。

现在功能的内部部分

original_selectCallback(variant, selector);

将调用与window.original_selectCallback相同的window.selectCallback,其功能与您现在的功能相同。

所以你使用永远不会结束的selectCallback进行递归。