JSLint:用于三元变量集的范围之外

时间:2015-03-17 21:23:50

标签: javascript ternary-operator jslint

我有一个像这样的代码块:

/*global MYAPP: true*/
var MYAPP = MYAPP || {};

JSLint在使用“MYAPP超出范围”消息的等号后突出显示“MYAPP”。

这有什么问题?

2 个答案:

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

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