質問

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

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

function whatever() {do something;}

とは対照的に...

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

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

関数キーワードですべての機能を宣言すると仮定すると、プログラミングスタイルの質問になると思います。個人的には、論理的であり、コードを可能な限り読みやすくするように、機能を構成することを好みます。たとえば、あなたのように、私はすべてが始まる場所だからです。

...私は、私にとって理にかなっている順序で機能を見るのが好きです。

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

問題は次のとおりです。チタンで構築されているiPhoneアプリ内でスクリプトを使用したいのですが、コンパイラは「定義された前に使用される」エラーで停止します。

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

これは愚かな質問かもしれませんが、関数を特定の順序で呼び出す必要がある場合、元々それを呼んだ関数に呼び戻す必要がある呼び出された関数の問題をどのように解決しますか?例えば...

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サイトやプログラムはありますか?

役に立ちましたか?

解決

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

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

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

   foo(); // wrong

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

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

これは、通訳者が最初に関数宣言を読み取り、名前を作成するためです foo 「右」を印刷する関数として、 var 声明、そしてすでに名前があることを見つけます foo そのため、値を持つ新しい変数を作成するスキップ undefined, 、通常起こるように。次に、への割り当てを含むコード、行ごとに処理します foo. 。関数宣言は再処理されません。たぶん、これはチタンで異なって動作するでしょうが、これをFirebugで試してみると、私が得たものが得られます。

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

var screen1, buildMenu;

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

また、これによりJSLINTに合格し、正しい動作が生成されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top