【问题标题】:JSLint Out of ScopeJSLint 超出范围
【发布时间】:2014-02-25 19:03:44
【问题描述】:

我有以下代码,并且“myGlobal”的使用超出了范围。我必须返回 myGlobal 或新对象,因为该对象已添加到其他文件中。

var myGlobal= (function (my) {
    'use strict';

    return my;
}(myGlobal|| {}));

这种情况下有没有办法满足jsLint?

【问题讨论】:

  • 可以单独声明和设置:var myGlobal; myGlobal = ((...)(myGlobal || {}));
  • @JonathanLonowski:这不就等同于var myGlobal; myGlobal = ((...)({})); 吗?
  • 在分配给它时不能使用myGlobal。您只能在分配完成后使用它,在您的情况下,这意味着在右侧的表达式完全完成评估然后分配给myGlobal之后。
  • @missingno 否。myGlobal || 仍然允许它重用现有对象。单独的 var myGlobal; 只是确保声明了 myGlobal 并且如果它是空操作,则保持当前值不变。

标签: javascript jslint


【解决方案1】:

当我遇到这个时,我想我通常会作弊。例如,在浏览器上下文中,所有全局变量实际上都存在于 window 对象上,因此您可以执行以下操作:

/*jslint sloppy:true, white:true, browser:true */
window.myGlobal = (function (my) {
    'use strict';

    return my;
}(window.myGlobal|| {}));

这在逻辑上归结为同样的事情,让 JSLint 很高兴。

快速编辑:或者,尽管这基本上是相同的技巧(这听起来可能是您已经尝试使用 myGlobal 设置的内容),但请考虑将您的全局变量分组到您定义为的命名空间中全球,像这样……

/*jslint sloppy:true, white:true, browser:true */
/*global MyNamespace */
MyNamespace.myGlobal = (function (my) {
    'use strict';

    return my;
}(MyNamespace.myGlobal|| {}));

虽然情况类似。如果您不能绝对确定您之前在某处定义了 MyNamespace 的包含,那么您现在正在尝试检查 MyNamespace 的存在。

因此,快速回答可以直接回到上面的 window 技巧。

【讨论】:

    【解决方案2】:

    使用this 作为全局范围的上下文:

    var myGlobal= (function (my) {
        'use strict';
    
        return my;
    }(this.myGlobal|| {}));
    

    浏览器宿主对象也可以这样做,例如document

    var controller = {};
    
    this.model = {"view": this.document || NaN, "viewmodel": controller.foo };
    
    
    controller.foo = function myfoo(model) {
        'use strict';
        return model.document.title;
    };
    
    this.model.viewmodel(this.model);
    

    参考文献

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2012-05-04
      • 2018-07-18
      相关资源
      最近更新 更多