可以在严格模式下仅在顶级声明函数

时间:2015-10-27 04:11:43

标签: javascript

使用具有严格模式的FireFox时出现此错误。但我不确定这意味着什么。我认为这意味着函数必须在调用之前声明,但错误仍然存​​在。

  

SyntaxError:在严格模式代码中,函数只能在顶级或紧接在另一个函数中声明

这是我的代码片段,它导致错误:

var process = new function(){

  var self = this;

  self.test = function(value,callback){
    var startTime = Date.now();

     function update(){     //<--- error is here
                value++;
                startTime        = Date.now();

                if(value < 100){ 
                    setTimeout(update, 0);
                }
                callback(value);
    }       
    update();
  }

};

所以我想知道如何用严格的方法正确编写这段代码?顶级是什么意思?这是指全局定义而不是函数中的本地定义吗?

另外,我有use strict为什么Chrome中不会出现此问题?

2 个答案:

答案 0 :(得分:6)

您必须在严格模式下将本地函数放在父函数中的其他代码之前:

var process = function () {
    var self = this;
    self.test = function (value, callback) {

        function update() {
            value++;
            startTime = Date.now();
            if (value < 100) {
                setTimeout(update, 0);
            }
            callback(value);
        }

        var startTime = Date.now();
        update();
    }
};

本文描述了这一点:

New ES5 strict mode requirement: function statements not at top level of a program or function are prohibited

MDN Strict Mode

在我自己的测试中(与我读过的文章相反),我发现当前版本的Chrome和Firefox只会抱怨本地函数定义(如果它位于块内)(例如{ {1}}或if语句或类似的块。

我想我需要找一个实际的规格来看看说的是什么。

答案 1 :(得分:0)

Internet Explorer错误明确指出不能在函数中“声明”函数名称。因此,使用自调用函数表达式对我有用。

此代码失败:

Controlling Log Levels with Properties

Log levels can be configured via properties defined in application.yml (and environment variables) with the log.level prefix:

logger:
    levels:
        foo.bar: ERROR

Note that the ability to control log levels via config is controlled via the LoggingSystem interface. Currently Micronaut ships with a single implementation that allows setting log levels for the Logback library. If another library is chosen you should provide a bean that implements this interface.

此代码有效:

    c.prototype.isitReal=function(t){
    var matched = false;
    this.each(function(item){
        // declaring a new function within a function fails 
        function getChildren(el){
            ....
            getChildren(el[a].children);
            ....
        }
        getChildren(el.children); // invoke function
    });
    return matched;
};

在FF 76,MSIE 10,Chrome Canary 81中经过测试