构建JavaScript对象以使其工作并传递JSLint的最佳方法是什么?

我一直试图看看我是否可以尽可能直观地构建我的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

这似乎运作良好.但是,当我通过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;
    },incrementId: function (inc) {
      setId(myId + inc);
    }
  };
}
最佳答案
我很确定这是JSLint中的一个错误.它还没有见过setId,因此它假定它是全局的.但实际上,它并没有什么区别,因为每个ECMAScript 5 10.5都会悬挂所有变量.这意味着你的第一个例子,第二个例子在语义上是相同的.函数中任何位置的局部变量声明都会立即处理,并且绑定最初设置为具有未定义的值.但是当函数(例如init)实际运行时,封闭的值不再是未定义的.

要查看setId最初是未定义的,但从不引用全局,请执行以下测试:

function setId()
{
  alert("Global setId");
}
function f()
{
  var init = function()
  {
    setId();
  }
  alert(typeof(setId));
  init();
  var setId = function()
  {

  }
}

它将警告undefined,然后抛出TypeError错误.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...