0

次のコードがあります。

function fn($){
  return function(){
    innerFn = function(){
      setTimeout(show, 1000);
    };

    show = function(){
      $.alert("TEST");
    }
  }
}

しかし、1 秒後に関数showを実行すると、$ is undefined と表示されます。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

ここでは、さまざまなことが行われています。最も重要なのは、innerFn が呼び出されないため、setTimeout が呼び出されないことです。これでうまくいくはずです。

function fn($){
  return function(){
    setTimeout(function(){
      $.alert("TEST");
    }, 1000);
  }
}

fn(window)(); //triggers your alert after 1000ms
于 2013-07-22T05:45:52.013 に答える
1

何も呼び出されないため、コードは意味がありません。

function fn($){
  return function(){
    innerFn = function(){
      setTimeout(show, 1000);
    };

    show = function(){
      $.alert("TEST");
    }
  }
}

fnpassing を呼び出すとwindow、実行できる関数が返されるとしましょう。しかし、この関数には関数宣言しか含まれていないvarため、グローバルスコープを汚染することも忘れてしまいます。これは悪いことです。何も起こりません。

次のように、内部で少なくとも 1 つの関数呼び出しが必要です。

function fn($){
  return function(){
    var innerFn = function(){
      setTimeout(show, 1000);
    };

    var show = function(){
      $.alert("TEST");
    }

    innerFn();
  }
}

fn(window)();

そして、それはうまくいきます。しかし、それは間違いなく冗長です。あなたはただ持つことができます:

function fn($){
  return function(){
    function show(){
      $.alert("TEST");
    }

    setTimeout(show, 1000);
  }
}

同じ結果を得るには。ただし、引数をsetTimeoutにバインドするだけが目的の場合は、 bindを使用できます。setTimeoutドキュメントにあるようにの 3 番目のパラメーターを使用できますが、従来の理由により IE ではサポートされていないようです。

したがって、 will の例bindは次のようになります。

function show() {
    this.alert('test');
}

setTimeout(show.bind(window), 1000);

またwindow、これはデフォルトでグローバル オブジェクトであるため、通常はそうする必要はなく、それだけalertで十分です。ただし、アラートの文字列が示すように、これは実際のコードではなく単なるテストだと思います。

代わりに最初のパラメーターとして使用することを好みwindow、 context objectthisに興味がない場合は、次のようにすることができます。

function show($) {
    $.alert('test');
}

setTimeout(show.bind(null, window), 1000);
于 2013-07-22T05:59:06.110 に答える