JSLint超出作用域

3
我有下面的代码,出现了“myGlobal”超出范围的问题。我必须返回myGlobal或一个新对象,因为在其他文件中会添加到该对象中。
var myGlobal= (function (my) {
    'use strict';

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

有没有一种方法可以在这种情况下满足jsLint?

1
如何让 JSLint 忽略代码? - Robert Harvey
可以分开声明和设置:var myGlobal; myGlobal = ((...)(myGlobal || {})); - Jonathan Lonowski
@JonathanLonowski:这不就相当于 var myGlobal; myGlobal = ((...)({})); 吗? - hugomg
在对 myGlobal 进行赋值的过程中,你不能使用它。只有在赋值完成后才能使用它,在你的情况下意味着右侧表达式完全被评估并分配给 myGlobal 后才能使用它。 - jfriend00
@missingno 不是的。myGlobal || 仍然可以重用一个已经存在的对象。而单独的 var myGlobal; 只是确保 myGlobal 已经声明,如果已经声明则不会有任何操作,保持当前值不变。 - Jonathan Lonowski
2个回答

2

当我遇到这种情况时,我通常会采用欺骗的方式。例如在浏览器上下文中,所有全局变量实际上都存在于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技巧。

0

使用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);

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接