未捕获的语法错误:在严格模式代码中,函数只能在顶层或立即在另一个函数中声明

Posted

技术标签:

【中文标题】未捕获的语法错误:在严格模式代码中,函数只能在顶层或立即在另一个函数中声明【英文标题】:Uncaught SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function 【发布时间】:2014-08-25 17:16:59 【问题描述】:

你好,当我在开发者模式(grunt server)https://github.com/kennethlynne/generator-angular-xl 运行这个项目时一切正常,但是当我在生产模式(grunt build)下运行它时,我得到一个`

Uncaught SyntaxError: 在严格模式代码中,函数只能是 在顶层或立即在另一个函数中声明

有人知道发生了什么吗? 谢谢,

附言。我发布了一个项目链接而不是代码,因为 JS 被拆分为许多文件。

【问题讨论】:

请指出发生此错误的文件。 看看javascript function cannot be found。顺便说一句,这不仅在严格模式下无效。 @Bergi 它指向所有 angularjs 脚本中的缩小 JS 文件。 尝试禁用缩小,或通过 linter 将项目中的每个文件。 恭喜,您在某处发现了错误! (提示:这不是你的错)github.com/components/jquery/issues/46 【参考方案1】:

这正是错误信息所说的:

函数只能在顶层或直接在另一个函数中声明

不得将函数声明放在任何其他块中,例如 if 语句或 for 循环。

例子:

'use strict';

function some() 

    function okay() 
    

    let x = 1;

    function no_problem() 
    

    if (x == 1) 

        function BOOM()    // <- wrong!
        
    

【讨论】:

我通过脚本找到的唯一一个没有立即在另一个函数中包含函数的文件是 app/scripts/modelsawesome.js,它在函数上方有一个 var 声明,但我将它移到下面但仍然没有 这是关于嵌套级别,而不是关于函数代码的顶部。变量声明不会打开块。不过,您能否链接该文件以便我仔细检查? Bergi 是对的,任何使用花括号的块作用域:try-catch-finally、if-else if-else、for、switch 和 ES6 也定义了利用块作用域的新特性,例如 class .你不能:"use strict" Function bar()/****/ 这作为一个整体会抛出一个错误。【参考方案2】:

正如上面有人建议的那样,您可以取消注释 'use strict'; 部分,或者更好的是,更改您的函数语法

而不是

function funcName (param)  

使用

funcName = function(param) ; 

【讨论】:

有趣的是,我在 Cordova 应用程序的 if 语句中有一个函数,只要它高于 4.4.4 版本就没有任何问题。使用较旧的平板电脑时被抓住了!注意:即使使用严格【参考方案3】:

我解决问题的方法是删除最终缩小脚本中 jquery 上方的 'use strict'。另一种方法是将 jQuery 版本更改为没有严格错误的版本

编辑:毕竟这是 1.11 版本的 jQuery 缩小错误,一个简单的解决方法是转到您的 Grunt 文件并注释掉该行

banner: "'use strict';\n"

【讨论】:

这是正确的答案,因为在应用程序中使用外部库的情况下,函数格式不是一个好主意。【参考方案4】:

除了正确答案之外,这可能在某些特定情况下也可能是 FireFox 中的错误。

我们在单个用户的计算机上收到此错误消息。在 JavaScript 文件中有一个use strict下面抛出此错误的方法(不应受此影响)

这恰好是 FireFox 版本 45.9.0(也可能是旧版本)的问题。将 Firefox 更新到最新版本(当前为 52.4)解决了该问题。

【讨论】:

【参考方案5】:

有趣的是,我是因为 换了一行,但我返回了一个对象,所以我改变了

来自

"use strict";
var funcName1 = function()
    /* some code*/
    return
     // note this bracket
        funcName2:function()/* some code*/,
    ;

"use strict";
var funcName1 = function()
    /* some code*/
    return  // to this, same line
        funcName2:function()/* some code*/,
    ;

【讨论】:

以上是关于未捕获的语法错误:在严格模式代码中,函数只能在顶层或立即在另一个函数中声明的主要内容,如果未能解决你的问题,请参考以下文章

严格模式是不是禁止语句级函数声明?

Javascript 使用严格错误未捕获

未捕获的语法错误。在<input id={{供应商.id }}中出现无效或意外的标记。

ReactNative进阶(二十三):Javascript 严格模式详解

获取未捕获的语法错误:意外的令牌:读取 jsonp 响应时

从文本文件加载 Json 对象 - 返回未捕获的语法错误:意外标记“[”