2017-03-03 5 views
3

再帰無限ループにこのコードのリード/ I次の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スコープ内だから)window.selectCallback関数を作成します。機能

original_selectCallback(variant, selector); 


今の内側の部分は、あなたが今している同じ機能をあるwindow.selectCallbackと同じであるwindow.original_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());

関連する問題