0

私はこのコードを持っています:

function a() {
    if(prodotto.approvatoIngredienti==true) {
        disegnaIconaIngredienti();

        function disegnaIconaIngredienti() {
            //
        }
    }

別の関数内で関数を定義しました。Chrome では問題はありませんが、Firefox では次のエラーが表示されます。

 --
 [15:26:41.279] disegnaIconaIngredienti is not defined @      http://127.0.0.1:8080/Tesi/javascript/InserimentoProdotti.js:1718

誰かが私に理由を説明できますか?

4

4 に答える 4

3

if2 行目のステートメントを閉じていません。

于 2012-12-07T14:29:14.380 に答える
2

あなたのコードはFirefoxで同等です

var disegnaIconaIngredienti;
if (prodotto.approvatoIngredienti==true){
   disegnaIconaIngredienti();
   disegnaIconaIngredienti = function(){
      //
   }
}

したがって、呼び出したときに変数に値はありません。

Chrome と Internet Explorer は、変数宣言だけでなく、関数宣言全体を持ち上げます。

ECMAScript では、非関数ブロック ( など) での関数定義は許可されていませんif。ブラウザはそれを許可しますが、方法は異なります。

この関連する質問は、トピックをさらに深く掘り下げます。

于 2012-12-07T14:30:45.200 に答える
1

これは、firefox に function ステートメントと呼ばれるものがあるためです。それらは典型的な宣言とは異なり、ブロック内で合法的に発生する可能性があります。

宣言で見られるような関数自体の巻き上げはないため、使用する前に定義する必要があります。

通常の ECMAScript では、一部のブラウザーでは許可されていますが、ステートメント内にそのスタイルの関数を含めることは無効であることに注意してください。ifStrict モードでは絶対に禁止されています。

内に完全に有効な関数を作成するにifは、代入などの式の一部である関数でなければなりません。

function a(){
    if(prodotto.approvatoIngredienti == true) {

                   // legal function in a block
         var disegnaIconaIngredienti = function() {
            //
         };
         disegnaIconaIngredienti();
     }
于 2012-12-07T14:31:02.940 に答える
0

ifブレースを閉じるのを忘れました

function a(){
if(prodotto.approvatoIngredienti==true){
    disegnaIconaIngredienti();
}

function disegnaIconaIngredienti() {
     //
     }
 }

あなたのクロージング if と @dystroy の投稿についてさらに検討した結果、私は彼に同意し、Firefox では使用が許可されていないと言う傾向があります。

回答する彼の投稿の一部:

ECMAScript では、非関数ブロック (if など) での関数定義は許可されていません。ブラウザはそれを許可しますが、方法は異なります。

Firefoxが条件ブロック内で許可しない場合のように。

于 2012-12-07T14:30:58.707 に答える