SyntaxError:Strict mode does not allow function declaration in a lexically nested statement.

本文解决了一个特定于React Native 0.39.1版本的问题,即在Strict Mode下无法在嵌套语句中声明函数的错误。提供了两种解决方法:一是修改InitializeCore.js文件中的函数声明方式;二是将React Native版本回滚至0.38.0。

 RN更像是一个不断成长的孩子,在成长的过程中,会遇到各种各样的问题,对于开发者,在不断打怪中升级,得到锻炼也在慢慢的成长。


问题描述

  使用React-native init创建了一个新项目,在package.json中使用的react-native的版本如下:

"dependencies": {
        "react": "15.4.1",
        "react-native": "0.39.1"
}
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

报出如下图所示的错误: 


SyntaxError 

SyntaxError:Strict mode does not allow function declaration in a lexically nested statement.
 
  • 1
  • 1

解决办法

第一种解决方案

打开  
.\node_modules\react-native\Libraries\Core\InitializeCore.js 112行。 
代码如下图:


 

function handleError(e, isFatal)替换成var handleError = function(e, isFatal) 
如下图所示:


 

最终执行npm start -- --reset-cache或者reload,解决问题。

第二种解决方案

react-native版本改成0.38.0也能解决问题。

"dependencies": {
        "react": "15.4.1",
        "react-native": "0.39.1"
}
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

改成

"dependencies": {
        "react": "15.4.1",
        "react-native": "0.38.0"
}
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

问题原因

  react-native的源码问题,在use strict严苛模式下,不允许如上的方式声明函数,会编译不通过,fackbook官方应该会会快修复这个问题。感谢阅读,希望能帮到你。


转载:http://blog.youkuaiyun.com/u013531824/article/details/53572821

<think>好的,我现在需要处理用户的问题:“Eval Error: Strict mode code may not include a with statement”。用户之前已经问过关于Node.js的OpenSSL错误,现在又遇到了另一个JavaScript错误,可能是在开发过程中遇到的。我得先理解这个错误的根源,然后给出解决方案。 首先,用户提到的错误信息是严格模式下的代码不能包含with语句。严格模式(strict mode)是ES5引入的,用于限制某些不安全的语法,with语句就是其中之一。所以当代码在严格模式下使用with时,就会抛出这个错误。 接下来,我需要分析用户可能的场景。用户可能在开发一个前端项目,或者使用Node.js,可能在Webpack、Babel等工具构建的项目中遇到了这个问题。用户可能是在升级依赖项后,或者引入了某个第三方库,导致代码被转译到严格模式,而其中包含了with语句。或者用户自己写的代码中不小心用了with,而环境默认启用了严格模式。 需要确定错误的具体来源。错误是发生在eval函数中,说明可能是动态执行的代码中有问题。eval执行的代码如果包含with语句,并且在严格模式下运行,就会报错。可能的情况包括: 1. 用户自己的代码中使用了eval,并且eval的字符串中有with语句。 2. 第三方库或工具生成的代码中包含了with语句,并且被eval执行。 3. 构建工具(如Webpack、Babel)在处理代码时,可能在某些情况下注入严格模式,导致原本非严格的代码中的with语句报错。 接下来,思考解决方案。首先,用户需要找到代码中使用with语句的地方,并替换掉。如果是因为第三方库的问题,可能需要更新库或寻找替代方案。另外,检查代码中是否显式或隐式启用了严格模式,导致with语句被禁止。 可能的解决步骤: 1. 查找代码中的with语句,替换为更安全的替代方式。 2. 检查是否在代码或配置中启用了严格模式,考虑是否有必要禁用,但通常不建议这样做。 3. 检查构建工具的配置,例如Babel是否强制添加了严格模式,如果是,可能需要调整配置。 4. 如果是第三方库的问题,考虑联系维护者或寻找替代库。 需要注意的是,严格模式是推荐的做法,禁用严格模式可能会带来其他问题,因此最佳实践是避免使用with语句。此外,eval本身也有安全性和性能问题,应尽量避免使用。 可能用户不太清楚with语句的问题,需要解释为什么严格模式禁止它,以及替代方法是什么。比如,使用变量临时存储对象属性,或者重构代码结构来避免with。 另外,考虑到用户之前遇到的是构建工具相关的错误,这次可能也是在构建或打包过程中出现的问题,比如代码经过转译后启用了严格模式,导致原有的with语句报错。这时候需要检查构建工具的配置,例如Babel的preset-env是否设置了严格模式,或者Webpack的某些插件在处理代码时添加了严格模式。 总结:用户需要定位到使用with语句的代码位置,修改代码,或者调整构建配置,避免在严格模式下执行with语句。</think>--- 遇到 `Eval Error: Strict mode code may not include a with statement` 错误时,根本原因是 JavaScript 的严格模式(`strict mode`)禁止使用 `with` 语句。以下是逐步分析与解决方法: --- ### **1. 问题根源** - **严格模式限制**:ES5 引入的严格模式(通过 `"use strict"` 声明)禁用了 `with` 语句,因为 `with` 会破坏作用域链,导致代码可读性差、性能下降,且易引发意外行为。 - **代码冲突**:若代码中同时存在 `"use strict"`(显式或隐式)和 `with` 语句,浏览器或 Node.js 会直接抛出此错误。 --- ### **2. 复现场景** #### **示例代码** ```javascript "use strict"; // 显式启用严格模式 with (Math) { // 使用 with 语句 console.log(PI); } ``` 运行后会报错: `Uncaught SyntaxError: Strict mode code may not include a with statement` --- ### **3. 解决方法** #### **方案一:移除 `with` 语句(推荐)** 直接替换 `with` 语句,改用更安全的语法: ```javascript "use strict"; // 原代码:with (Math) { console.log(PI); } console.log(Math.PI); // 直接访问对象属性 ``` #### **方案二:禁用严格模式(不推荐)** 移除代码中的 `"use strict"` 声明,但会失去严格模式的错误检测和优化优势: ```javascript // 移除 "use strict" with (Math) { console.log(PI); } ``` --- ### **4. 深入分析** #### **为何严格模式禁用 `with`?** 1. **作用域混淆**:`with` 会将对象的属性“注入”到当前作用域,导致变量解析不确定性。 ```javascript const x = 10; const obj = { x: 20 }; with (obj) { console.log(x); // 输出 20 还是 10? } ``` 2. **性能问题**:引擎难以优化 `with` 代码块内的变量查找。 #### **隐式严格模式** 某些情况下,代码可能隐式启用严格模式: - ES6 模块(`<script type="module">`)。 - 使用 Babel 等工具转译时默认添加严格模式。 - 类(`class`)或模块化语法(`import/export`)。 --- ### **5. 构建工具相关** 若错误来自第三方库或构建工具(如 Webpack、Babel),需检查配置: #### **案例:Babel 默认添加严格模式** 在 Babel 配置文件中关闭严格模式(`.babelrc` 或 `babel.config.js`): ```javascript { "presets": [ ["@babel/preset-env", { "modules": false }] ], "plugins": [ // 关闭严格模式 ["@babel/plugin-transform-modules-commonjs", { "strictMode": false }] ] } ``` --- ### **6. 验证解决** - 确保代码中无 `with` 语句。 - 若必须使用 `with`,确认代码未启用严格模式(检查显式声明、构建工具配置等)。 --- ### **7. 扩展建议** - **代码规范**:避免使用 `with`,改用明确的属性访问(如 `obj.property`)。 - **静态分析工具**:使用 ESLint 检测代码中的 `with` 语句: ```bash npm install eslint --save-dev ``` 配置 `.eslintrc.json`: ```json { "rules": { "no-with": "error" } } ``` --- 通过移除 `with` 语句或调整严格模式配置,可彻底解决此错误。**强烈建议遵循方案一**,以提升代码质量和性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值