我有一个像这样的代码块:
/*global MYAPP: true*/
var MYAPP = MYAPP || {};
JSLint在使用“MYAPP超出范围”消息的等号后突出显示“MYAPP”。
这有什么问题?
答案 0 :(得分:2)
如果您使用var
,那么您将声明一个局部变量。
如果你执行MYAPP || {}
,那么通常会尝试为全局变量或先前声明的变量设置默认值。
MYAPP
应该是什么范围?如果它是全局的,那么像
MYAPP = window.MYAPP || {};
window.
阻止它抱怨未定义
如果它不是全局但是先前声明,那么
MYAPP = MYAPP || {};
如果它是函数的局部新变量,那么该行是
的一部分var MYAPP = {};
如果您在脚本的顶层定义了一个变量(即不在函数中),那么它就是全局变量。如果在具有相同名称的两个不同脚本标记(或javascript文件)中具有全局变量,则它们是相同的变量。 如果要隐藏其他脚本标记(或javascript文件)中的变量,请考虑使用IIFE(立即调用的函数表达式)。 e.g。
(function() {
var MYAPP = {};
//code that uses MYAPP;
})();
//MYAPP is not visible out here, or in other script tags/files.
答案 1 :(得分:1)
对于jshint,jslint,sonarqube等,如果没有使用var
(let
或const
)明确声明,则不能使用任何变量。
如果你想将它们设置为全局,你必须在第一时间定义当前的全局关键字是什么,因为它window
进入浏览器,但在其他情况下,可能不是这样! / p>
请看下面如何避免警告(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 || {};