3

簡単に言えば:

var o="before";
x = function() //this needs to be an anonymous function
{
  alert(o); //the variable "o" is from the parent scope
};
o="after"; //this chages "o" in the anonymous function

x();
//this results in in alert("after");
//which is not the way i want/need it

実際には、私のコードはもう少し複雑です。

私のスクリプトは多くの html オブジェクトを繰り返し処理し、要素ごとにイベント リスナーを追加します。

これを行うには、要素ごとに無名関数を宣言し、ID を引数として別の関数を呼び出します。その ID は、この例では "o" 変数で表されます。

しばらく考えた後、なぜそうなのか理解しましたが、id属性を処理してそこからIDを取得せずに匿名関数を宣言するときに、jsにoを評価させる方法はありますか?

私の完全なソースコードはここにあります: http://pastebin.com/GMieerdw

無名関数は 303 行目にあります。

4

3 に答える 3

8

variable のクロージャを作成する必要がありますo。これを行うには、値を受け取る関数を割り当てて、その値を使用する関数を返します。例を次のように変更して、目的の効果を得ることができます。

var o="before";
x = function(inner) {
    return function()
    {
      alert(inner);
    }
} (o); //here, the anonymous function is called, which will return another function which uses o
o="after";

x();//prints "before"

詳細な説明については、MDC の記事を参照してください。この記事には、ループでのクロージャーの使用に関するセクションがあります。

これと同じ手法をループに適用できます。このようなことは、あなたがやりたいことです:

var fn = function(x, y) {
    return function() {
        rr_download_start(x, y);
    }
} (i, this);
link.addEventListener('click', fn ,false);
于 2010-05-10T21:56:50.827 に答える
6

次のような自己呼び出し関数を使用してみてください。

var o = 0;
for(var i=0;i<elements.length;i++){
    (function(obj,variable){
        obj.onclick = function(){
            alert(variable);
        }
    })(elements[i],o);
    o++;
}

「o」の最終値を警告するのではなく、ループ中の値が何であれ、「o」を警告する必要があります。

これが何らかの形で役立つことを願っています。

于 2010-05-10T21:48:52.857 に答える
0

1 つの方法は、カリー化関数を作成することです。

function curry(fun, arg) {
  return function() {
    return fun(arg);
  };
};

// start loop 
var o="before";
x = curry(function(o) {
  alert(o);
}, o);
o="after";

x(); // "before"

もう 1 つの方法は、外部データ ソースを使用するthisことです。関数が呼び出された場所によって異なるため、ハンドラーをバインドする DOM ノードに値を格納できます。このようにして、多数の無名関数の代わりに単一の関数を使用できます。この手法にはいくつかの注意点があります (循環参照は IE6 でメモリ リークを引き起こす可能性があります)。例)jQuery では次のように記述できます。

function doStuff() {
  alert($(this).data('o'));
}

// start loop
var o="before";
someDomElement.data('o', 'before');
someDomElement.bind('someEvent', doStuff);
o="after";

someDomElement.trigger('someEvent'); // "before"
于 2010-05-10T22:21:41.093 に答える