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

问题描述:

我有以下的javascript代码:为什么会这样的代码导致无限循环/递归

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

不知何故,2号线:

var selectCallback = function(variant, selector) 

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

+0

我看不到有什么你的问题? –

+0

代码应该第一次工作,但刷新页面后将失败。你刷新了页面吗? – nikhil

+1

它不是递归的,除非'selectCallback'最初已经调用自己,并期待返回值或什么来阻止递归。 – plalx

让我们来检查你的代码:

var original_selectCallback = window.selectCallback; 

创建指向函数selectCallback新的变量。


var selectCallback = function(variant, selector) { 

创建window.selectCallback功能(因为它在window范围)。功能

original_selectCallback(variant, selector); 


现在内部将调用window.original_selectCallback是相同window.selectCallback也就是你现在相同的功能。

因此,您使用永不结束的selectCallback进行递归。

没有什么内在的错误你的代码已经发布:

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

的错误很可能会在window.selectCallback初始定义,这里没有显示。

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

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());