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 等,没有使用 varletconst)明确声明的变量不能使用。

如果你想将它们设置为全局,你必须首先定义什么是当前全局关键字,因为它 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 || {};