10

「定義される前に使用された」エラーを除いて、JSLint を渡す長い JavaScript ファイルがあります。

次のように、通常の関数宣言を使用しました...

function whatever() {do something;}

とは対照的に...

var whatever = function(){do something;};

以前の投稿に対するスティーブ・ハリソンの返信と一致しています...

すべての関数を function キーワードで宣言すると仮定すると、プログラミング スタイルの問題になると思います。個人的には、論理的に見えるように関数を構成し、コードをできるだけ読みやすくすることを好みます。たとえば、あなたと同じように、init 関数を一番上に置きます。ここからすべてが始まるからです。

... 関数を自分にとって意味のある順序で見るのが好きです。

このスクリプトは、テストされたいくつかのブラウザー (例: FireFox、Safari、Mobile Safari、Fennec、IE、Chrome、Midori など) で完全に機能します。

ここに問題があります。Titanium でビルドされた iPhone アプリ内でスクリプトを使用したいのですが、そのコンパイラは「used before defined」エラーで停止します。

どうすればこれを回避できますか?

これはばかげた質問かもしれませんが...関数を特定の順序で呼び出す必要がある場合、呼び出された関数が最初に呼び出した関数にコールバックする必要があるという問題をどのように解決しますか? 例えば...

function buildMenu(){
     Display a list of five menu items, each of which calls a function to build the associated screen.
}

function screen1() {
     Display the screen associated with menu item #1.
}

関数を順番に宣言する必要がある場合は、function screen1を先行させる必要がありfunction buildMenuます。しかし、特定の条件下で screen1 をビルドできず、メニューを再表示したい場合 (つまり、技術的にまだ宣言されていない関数を呼び出す場合) はどうでしょうか。

そうそう... もう 1 つの質問: プログラマーが手動で行うのではなく、関数を自動的に並べ替える Web サイトまたはプログラムはありますか?

4

1 に答える 1

10

いいえ、EM の答えは正しい解決策ではありません。この JavaScript を実行してみてください:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

これは、インタープリターが最初に関数宣言を読み取り、foo「right」を出力する関数として名前を作成し、次にvarステートメントを読み取り、名前が既に存在することを検出するため、値をfoo持つ新しい変数の作成をスキップするためです。undefined通常起こります。次に、への割り当てを含むコードを行ごとに処理しますfoo。関数宣言は再処理されません。これは Titanium では異なる動作をするかもしれませんが、Firebug でこれを試してみると、私が得たものが得られます。

より良い解決策は次のとおりです。

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

これにより、JSLint も渡され、正しい動作が生成されます。

于 2010-03-05T21:16:55.003 に答える