Javascript 函数只能在严格模式的顶层声明

Javascript 函数只能在严格模式的顶层声明,javascript,Javascript,我在使用严格模式的FireFox时出现了这个错误。但我不确定这意味着什么。我假设这意味着在调用函数之前必须声明该函数,但错误仍然发生 SyntaxError:在严格模式代码中,函数只能在顶层声明,或者直接在另一个函数中声明 这是导致错误的代码片段: var process = new function(){ var self = this; self.test = function(value,callback){ var startTime = Date.now();

我在使用严格模式的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();
  }

};
var进程=新函数(){
var self=这个;
self.test=函数(值,回调){
var startTime=Date.now();

函数更新(){/在严格模式下,必须将本地函数置于父函数中其他代码之前:

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();
    }
};
var进程=函数(){
var self=这个;
self.test=函数(值,回调){
函数更新(){
值++;
startTime=Date.now();
如果(值<100){
setTimeout(更新,0);
}
回调(值);
}
var startTime=Date.now();
更新();
}
};
本文对此进行了描述:

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


我想我需要找到一个实际的规范来看看它是怎么说的。

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

此代码失败:

    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;
};
此代码适用于:

    c.prototype.isitReal=function(t){
    var matched = false;
    this.each(function(item){
        // convert the function to an expression of a function
        // by wraping the entire function in ( )

        (function getChildren(el){
            ....
            getChildren(el[a].children);
            ....
            // then invoke the function expresion by adding ()
            // to the end. Pass in any arguments here also
        })(el.children,arg2,arg3);
    });
    return matched;
};

在FF 76、MSIE 10、Chrome Canary 81中测试,错误为
语法错误:在严格模式代码中,函数只能在顶层声明,也可以直接在另一个函数中声明
?哎呀,在格式化问题时,yeh必须删除它,因为这段代码不会导致任何错误。您能否发布一个简单的代码示例来说明您遇到的问题experiencing@JaromandaX可能是因为您没有在Firefox中启用严格模式。鉴于我在Chrome中没有遇到此问题,这是否建议
使用严格模式
实际上在Chrome中不起作用?@Dave-当前版本的Chrome和Firefox似乎只在函数位于块内时才会抱怨这个问题(比如在
if
语句内)虽然这不是我读过的资料中描述的功能。嗯,对我来说,Chrome还没有给我一个投诉。但是FireFox讨厌一切lol。Chrome似乎没有那么严格=/嗯,我不相信这个答案在规范方面是正确的。“立即”警告中应该提到嵌套,而不是顺序。如果更改这些语句的顺序真的解决了错误,那听起来像是Firefox中的一个错误。另外,请注意ES5和ES6的语法在这个错误上有所不同。错误是针对ES5的,我认为它不适用于ES6。@JMM-浏览器和严格的de已经改变了他们的想法。如果你看第二个代码示例,MDN清楚地说某些东西应该导致语法错误,因为嵌套函数声明在严格模式下是不允许的,但所有当前浏览器都允许。这似乎有点让人困惑。这就是我在2015年写下这个答案的信息。