JSLint:在三元变量集的作用域之外使用

JSLint: used out of scope for ternary variable set

本文关键字:作用域 变量 三元 JSLint      更新时间:2023-09-26

我有一个这样的代码块:

/*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等,如果没有用varletconst)显式声明,则不能使用任何变量。

如果你想将它们设置为全局关键字,你必须在第一时间定义当前全局关键字是什么,因为它在浏览器中是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 || {};