【发布时间】:2011-09-12 03:46:27
【问题描述】:
无法让以下内容通过 jslint/jshint
/*jshint strict: true */
var myModule = (function() {
"use strict";
var privVar = true,
pubVar = false;
function privFn() {
return this.test; // -> Strict violation.
}
function pubFn() {
this.test = 'public'; // -> Strict violation.
privFn.call(this); // -> Strict violation.
}
return {
pubVar: pubVar,
pubFn: pubFn
};
}());
myModule.pubFn();
我知道这是由于在函数声明中使用 this 引起的,但我读了 Crockford 写的一些东西,他说违规是为了防止全局变量污染 - 但这里唯一的全局变量是我m 明确定义...myModule。其他所有内容都保存在直接函数范围内,我应该能够使用this 来引用该模块。
有什么想法可以让这种模式通过吗?
更新:如果我使用函数表达式而不是声明,这似乎可行,即
var pubFn = function () { ...
虽然我不喜欢这种格式,但我更喜欢函数名称和命名参数更接近,并且声明看起来/感觉更清晰。老实说,我不明白为什么会引发违规行为 - 这种模式没有理由这样做。
【问题讨论】:
-
听起来像是可以忽略 jslint 抱怨的情况之一。顺便说一句,
pubVar在以myModule.pubVar访问时如何工作?它并没有真正让模型外部的代码访问模块中的变量,对吗?我会认为,如果您想实际获取/设置模块变量的当前值,则需要 getter 和 setter 函数。 -
你说得对,我觉得这看起来有点滑稽。如果您尝试
myModule.pubVar = true,您只需重写对象的属性。内部pubVar将保持为false -
更新:我更喜欢
var foo = function(){}而不是function foo(){},因为它有助于避免托管问题。此外,我喜欢它确实 使函数看起来更像其他变量,因为在 JS 中,函数或任何其他值之间没有区别——它们是一流的。个人喜好,我知道——但我想我会抛出一些想法。 -
伪题外话:如果你仍然想使用这种我个人不喜欢的模式......你可以使用“crockford”变体,即直接在返回对象中键入公共接口。它甚至更短,更容易维护。无论如何,为私有成员使用闭包是不值得的。
-
@ikaros45 “无论如何,对私有成员使用闭包是不值得的。”我想知道为什么
标签: javascript strict module-pattern