2017-03-03 54 views
3

我有以下的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

回答

-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進行遞歸。

1

沒有什麼內在的錯誤你的代碼已經發布:

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

的錯誤很可能會在window.selectCallback初始定義,這裏沒有顯示。

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

相關問題