0

我有这个代码:

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

        function disegnaIconaIngredienti() {
            //
        }
    }

我在另一个函数中定义了一个函数。使用chrome和ie我没有问题,但是firefox给了我这个错误:

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

有人可以解释我为什么吗?

4

4 回答 4

3

你还没有if在第二行结束你的陈述。

于 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 有一些叫做函数语句的东西。它们不同于典型的声明,并且可以合法地在一个块中发生。

正如您在声明中发现的那样,函数本身没有提升,因此需要在使用之前对其进行定义。

请注意,在典型的 ECMAScript 中,在语句中包含这种风格的函数是无效if的,尽管某些浏览器允许这样做。严格模式绝对禁止它。

要在 中创建完全有效的函数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 回答