2

私はいくつかの JavaScript プロファイリング ビットを書いており、クロージャー内のメソッドをインターセプトできるようにする必要があります。

私はこれを機能させることができました:

var t = (function() {

  var echo = function(v) { console.log("calling echo with " + v); }; 

  return {
    intercept: function(n, f) {
      var old = eval(n);
      var newFunction = (function(that, old){
        return f(that, old);
      })(this, old);
      eval(n + " = newFunction ");
    },
    getEchoFunction: function() { return echo; }
  };  
})(); 


var c = t.getEchoFunction();

c("hello");



t.intercept("echo", function(that,old){
  return function() {
    console.log("before echo");
    old.apply(that,arguments);
    console.log("after echo");
  };
});


c = t.getEchoFunction();

c("world");

出力は次のとおりです。

「hello で echo を呼び出す」
「反響前」
"calling echo with world"
「アフターエコー」

したがって、この「インターセプト」API を使用すると、クロージャーに隠されている関数宣言をインターセプトして書き直すことができます。

しかし、世の中には eval に対する不満がたくさんあります。

eval関数で使用する必要なく同じ API を作成する方法はありinterceptますか?

4

1 に答える 1

3

いいえ、残念ながら、動作のように非グローバル スコープにアクセスする方法はありませんwindow[...]

ただし、必要に応じて、ネイティブ スコープの代わりにオブジェクトを使用することをお勧めします。

于 2012-11-18T23:23:39.060 に答える