JS严格模式下如何安全访问仅部分场景定义的cordova变量
严格模式下未声明Cordova变量的报错规避方案
核心报错原因:'use strict'严格模式下,直接访问未声明的变量会直接抛出ReferenceError引用错误,不会像非严格模式那样默认返回undefined,这就是写if (cordova) {...}依然会崩溃的根本原因。
以下是三种经过验证的可行方案,可根据项目场景选择:
- 用
typeof做安全前置检测typeof是JS原生提供的可以安全操作未声明变量的运算符,遇到未声明的变量时不会抛错,只会返回字符串'undefined',完全兼容严格模式规则,是通用性最高的方案。
改造后的代码示例:'use strict'; angular.module('myApp').factory('factoryName', function(){ let plugins = {}; // 安全校验通过后再调用cordova能力 if (typeof cordova !== 'undefined') { plugins = cordova.require('cordova/plugin_list').metadata; } // 非Cordova环境下plugins为预设的默认空值,后续逻辑可正常执行 // ...其余业务逻辑 }); - 通过全局window对象访问
浏览器和Cordova的WebView运行环境中,所有全局变量都会作为属性挂载在顶层window对象上。访问对象不存在的属性时只会返回undefined,不会触发引用错误,写法更简洁:'use strict'; angular.module('myApp').factory('factoryName', function(){ let plugins = {}; if (window.cordova) { plugins = cordova.require('cordova/plugin_list').metadata; } // ...其余业务逻辑 }); - 提前注入全局Mock做统一降级
如果项目中有多处依赖Cordova的逻辑,反复写判断会让代码冗余。可以在应用启动的最入口处(所有依赖Cordova的业务代码执行之前)提前做环境判断,非Cordova环境下直接注入Mock实现,后续业务代码完全不需要修改:// 应用入口最顶部执行 'use strict'; if (typeof cordova === 'undefined') { window.cordova = { require: () => ({ metadata: {} }), // 按需补充项目中用到的其他Cordova方法的Mock实现即可 }; } // 原有业务代码无需改动,浏览器环境下也不会报错 angular.module('myApp').factory('factoryName', function(){ var plugins = cordova.require('cordova/plugin_list').metadata; // ... });
注意:如果项目使用Webpack、Vite等模块化打包工具,不要在模块作用域直接声明
var cordova试图补全变量,模块化作用域下的声明不会挂载到全局,必须显式赋值给window.cordova才能生效。
内容的提问来源于stack exchange,提问作者dawg
相关产品推荐
相关产品推荐

