我有以下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函数。那么为什么这是一个递归调用呢? 任何建议/意见表示赞赏。
答案 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
进行递归。