JSLint:在三元变量集的作用域之外使用
JSLint: used out of scope for ternary variable set
我有一个这样的代码块:
/*global MYAPP: true*/
var MYAPP = MYAPP || {};
JSLint在等号后突出显示"MYAPP",并显示消息"MYAPP超出范围使用"。
怎么了?
如果使用var
,则声明一个局部变量。如果执行MYAPP || {}
,则通常会尝试为全局变量或之前声明的变量设置默认值。
MYAPP
的范围应该是什么?如果它是全球性的,那么类似的东西
MYAPP = window.MYAPP || {};
window.
阻止它抱怨它是未定义的
如果它不是全局的,而是更早声明的,那么
MYAPP = MYAPP || {};
如果是该行所属函数的局部新变量,则
var MYAPP = {};
如果在脚本的顶层定义了一个变量(即不在函数中),那么它就是一个全局变量。如果两个不同的脚本标记(或javascript文件)中有相同名称的全局变量,那么它们就是同一个变量。如果要对其他脚本标记(或javascript文件)隐藏变量,请考虑使用IIFE(立即调用的函数表达式)。例如
(function() {
var MYAPP = {};
//code that uses MYAPP;
})();
//MYAPP is not visible out here, or in other script tags/files.
对于jshint、jslint、sonarqube等,如果没有用var
(let
或const
)显式声明,则不能使用任何变量。
如果你想将它们设置为全局关键字,你必须在第一时间定义当前全局关键字是什么,因为它在浏览器中是window
,但在其他上下文中,可能不是这样!
因此,请参阅下面如何避免您的警告(JSDoc注释不是解决方案的一部分,但解释了为什么有用)。
/**
* @fileOverview Starting point for Front-end [Your Project Name]'s JavaScript.
* @author {@link http://www.lesieur.name/|Bruno Lesieur}
* @version 1.0.0
* @module Common
* @requires {@link external:jQuery}
*/
var window = this,
/**
* Container for all function of website.
* @namespace website
* @global
* @type {Object}
*/
website = window.website || {},
/**
* Write less, Do more.
* @external jQuery
* @global
* @see {@link https://jquery.com/|jQuery}
*/
$ = window.$,
/**
* Shortcut for $(window).
* @global
* @type {jQuery}
*/
$window = window.$window || $(window);
/**
* All components (modules) avaiable on all pages.
* @namespace components
* @alias components
* @type {Object}
* @memberOf website.
*/
website.components = website.components || {};
所以在你的例子中,简单的方法是:
var window = this,
MYAPP = window.MYAPP || {};
或
var global = this,
MYAPP = global.MYAPP || {};
或
var MYAPP = this.MYAPP || {};
相关文章:
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量