我一直试图看看我是否可以尽可能直观地构建我的JavaScript对象,同时确保它尽可能"正确".我一直在通过Crockford的JSLint.com运行一系列不同的场景,并且没有太多运气.我似乎修复了一个错误,然后由于更改而弹出另一个错误.以下是我能得到的最好的.有没有人对此有另一种看法?
这是我构造对象的典型方式:
function gizmo(id) {
/* private variables */
var myId = id;
/* private methods */
var init = function () {
if (myId < 1) {
setId(1);
}
};
var setId = function (newId) {
myId = newId;
};
// run 'constructor'
init();
/* public methods */
return {
getId: function () {
return myId;
},
setId: function (newId) {
setId(newId);
},
incrementId: function (inc) {
setId(myId + inc);
}
};
}
// creating an instance of gizmo
var myGizmo = gizmo(-2);
console.log(myGizmo.getId()); // outputs 1
myGizmo.setId(5);
console.log(myGizmo.getId()); // outputs 5
myGizmo.incrementId(2);
console.log(myGizmo.getId()); /// outputs 7
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好.但是,当我通过JSLint运行它时,它给出了一个错误,指出我的两个私有函数是'Implied Globals'.
我能想到的最好的方法是使用如下变量在顶部声明我的函数:
function gizmo(id) {
/* private variables */
var myId = id,
init,
setId;
/* private methods */
init = function () {
if (myId < 1) {
setId(1);
}
};
setId = function (newId) {
myId = newId;
};
// run 'constructor'
init();
/* public methods */
return {
getId: function () {
return myId;
},
setId: function (newId) {
setId(newId);
},
incrementId: function (inc) {
setId(myId + inc);
}
};
}
Run Code Online (Sandbox Code Playgroud)
我很确定这是 JSLint 中的一个错误。它还没有看到setId,所以它假设它是全球性的。但实际上,这没有什么区别,因为根据ECMAScript 5 10.5var所有的s 都被提升了。这意味着您的第一个示例和第二个示例在语义上是相同的。函数中任何位置的局部变量声明都会立即处理,并且绑定最初设置为具有值。但当函数(例如 init)实际运行时,封闭值不再是。undefinedundefined
要查看它setId最初是未定义的,但从未引用全局,请执行以下测试:
function setId()
{
alert("Global setId");
}
function f()
{
var init = function()
{
setId();
}
alert(typeof(setId));
init();
var setId = function()
{
}
}
Run Code Online (Sandbox Code Playgroud)
它将警告未定义,然后抛出TypeError错误。
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |