简体   繁体   中英

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

After upgrading from React Native 0.18 to 0.22 for Android, I have started to get the following error:

Got JS Exception: SyntaxError: Strict mode does not allow function declarations in a lexically nested statement.

It crashes the app at start app, and it is impossible to start debugging.

As suggested by this post , I have tried to remove all 'use strict' manually as well as using build script:

gulp.task('transform-android', function() {
  return gulp.src(config.tasks.androidjs.src)
  .pipe(envify({NATIVE: true}))
  .pipe(babel({ 
    "stage": 0,
    blacklist: ["useStrict"]
  }))
  .pipe(gulp.dest(path.join(config.root.dest, config.tasks.androidjs.dest)));
});

There is no 'use strict' anymore in the generated code. However, I am still getting the exact same error. I am using babel v5.8.3.

Any help is highly appreciated!

Here's my package.json

{
  "name": "xodo",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node_modules/react-native/packager/packager.sh"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "events": "^1.1.0",
    "firebase": "^2.3.1",
    "flux": "^2.0.1",
    "immutable": "3.7.3",
    "jwt-decode": "^1.4.0",
    "linkifyjs": "^2.0.0-beta.7",
    "lodash": "^3.10.1",
    "promise-queue": "^2.2.3",
    "react": "^0.14.7",
    "react-immutable-proptypes": "^1.5.1",
    "react-native": "^0.22.2",
    "react-native-invertible-scroll-view": "^0.2.0",
    "reqwest": "^1.1.5",
    "rsvp": "^3.0.18",
    "unbounce": "^0.1.0",
    "xmldom": "^0.1.22"
  },
  "devDependencies": {
    "babel": "^5.8.3",
    "del": "^2.2.0",
    "gulp": "^3.9.0",
    "gulp-babel": "^5.3.0",
    "gulp-envify": "^1.0.0",
    "gulp-less2js": "0.0.3",
    "gulp-rename": "^1.2.2",
    "gulp-replace": "^0.5.4",
    "gulp-sequence": "^0.4.0",
    "path": "^0.12.7"
  }
}

Below is the full stacktrace of the error:

Got JS Exception: SyntaxError: Strict mode does not allow function declarations in a lexically nested statement.
03-29 15:15:01.567 2047-2109/com.xodo.pdf.reader E/unknown:React: Exception in native call from JS
                                                                  com.facebook.react.bridge.JSExecutionException: SyntaxError: Strict mode does not allow function declarations in a lexically nested statement. (http://10.0.3.2:8081/index.android.bundle?platform=android&dev=true&hot=false:32356)
                                                                      at com.facebook.react.bridge.ReactBridge.loadScriptFromFile(Native Method)
                                                                      at com.facebook.react.bridge.JSBundleLoader$2.loadScript(JSBundleLoader.java:58)
                                                                      at com.facebook.react.bridge.CatalystInstanceImpl$2.call(CatalystInstanceImpl.java:146)
                                                                      at com.facebook.react.bridge.CatalystInstanceImpl$2.call(CatalystInstanceImpl.java:137)
                                                                      at com.facebook.react.bridge.queue.MessageQueueThreadImpl$1.run(MessageQueueThreadImpl.java:73)
                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
                                                                      at android.os.Looper.loop(Looper.java:148)
                                                                      at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:184)
                                                                      at java.lang.Thread.run(Thread.java:818)

problem appears in one of the core files. pull request is alredy created for react-native but you can make changes by yourself as workaround

open node_modules\\react-native\\Libraries\\Core\\InitializeCore.js line 112

change function handleError(e, isFatal) to var handleError = function(e, isFatal)

then do npm start -- --reset-cache

you can find more information at https://github.com/facebook/react-native/issues/11389

This is not a direct answer to your problem but more of a concept or reason behind the error.

When an inner function is defined in a block rather than function body it will give SyntaxError. ES5 disallows function declarations on blocks (except function bodies). On the other hand, ES2015 (ES6) has relaxed this restriction.

Here is ESLint rule no-inner-declaration

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM