JSLint:超出三元变量集的范围使用
JSLint: used out of scope for ternary variable set
我有这样一个代码块:
/*global MYAPP: true*/
var MYAPP = MYAPP || {};
JSLint 在消息 "MYAPP used out of scope".
等号后突出显示 "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 Comment 不是解决方案的一部分,但解释了为什么有用)。
/**
* @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 || {};
我有这样一个代码块:
/*global MYAPP: true*/
var MYAPP = MYAPP || {};
JSLint 在消息 "MYAPP used out of scope".
等号后突出显示 "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 Comment 不是解决方案的一部分,但解释了为什么有用)。
/**
* @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 || {};