5

以下は、クロージャ内で無名関数を定義し、関数を呼び出して、それを忘れる方法です。

(function () { "do stuff"; })();

これは、スクリプトにバルクを追加せずに限定されたスコープを維持するために使用されます(IIFE:即時呼び出し関数式)。

次のように、将来の使用のために関数を保持しながら、関数をすぐに実行したい場合はどうなりますか。

var doThing;
(doThing = function () { "do stuff"; })();

これは、私がテストしたブラウザー(Chrome、FF、IE8、IE10)で機能しますが、JSLint(Bad Invocation)に合格しません。この方法で互換性の問題はありますか?

JSLintが親切に見ているこれを達成する方法はありますか?

4

5 に答える 5

7

jslintを渡すことが絶対に必要な場合は、次のようにします。

var doThing;
(doThing = function () { "do stuff"; }).call();

仕事をする必要があります。

編集

中にパラメータを渡すため.call

var doThing;
(doThing = function (param1, param2) { 'do stuff'; }).call(this, arg1, arg2);
于 2012-09-10T20:43:27.027 に答える
3

関数参照の割り当てと関数の呼び出しを同時に行わないでください。この種のことは、変数を参照に割り当てる、変数をリターンに割り当てる、または変数を割り当ての結果に割り当てるという既存の可能性を追加するため、ヘッドが爆発しやすくなります。他の誰もがあなたのコードを読むことができるようにする方法は、2行でそれを行うことです。それを関数でラップしたい場合は、次のようになります。

var doThing = (function() {
  var inner = function() {
     //doThing body
  };
  inner();
  return inner;
})();

それ自体は、呼び出しが関係なく固執しないので、単純な方法でそれを行うことに対する難読化に他なりません。ただし、本当にこれを行う関数を作成したい場合は、次のようにすることができます。

var callAndRef = function(funk) {
  funk();
  return funk;
};

その後

var doThing = callAndRef(function() {
//doThing body
});

または、もっと気が利いていて、JSの達人が一緒に作業している場合は、それをFunction.prototypeにスローして、宣言から切り離すことができます。参照と引数を維持するために、呼び出し/適用をペッパーすることもできthisます(ただし、それは現在の質問のノイズにすぎないようです)。

これらはすべて、非常に慎重に行う必要があります。このルートを使用して、それぞれ1つのコマンドを2行余分に入力する手間を省くのは確かに価値がありません。

于 2012-09-10T20:32:48.170 に答える
3

コードを少し並べ替えると役立ちます。

var doThing = function () { "do stuff"; };
doThing();

また

var doThing = function () { "do stuff"; };
(doThing)();
于 2012-09-10T20:34:23.793 に答える
0

Bad Invocationの問題のみを修正したい場合は、次のようにすることができます。

var doThing;
doThing = function () { "do stuff"; };
doThing();

宣言と割り当てを分割することで、コードの理解と保守が容易になります。別のオプションは、次の名前で関数を宣言することです。

function doThing() { "do stuff"; }
doThing();
于 2012-09-10T21:15:53.403 に答える
-1

JSLinkは、Javascriptの記述方法に関するCrawfordの個人的な意見です。そのほとんどは優れたアドバイスですが、彼の意見が邪魔になることもあります。

これは、その行を書くためのより「標準的な」方法です。

var doThing = (function () { "do stuff"; }());

全体(関数...)がparensの中にあることに注意してください。

于 2012-09-10T20:34:00.007 に答える