代码之家  ›  专栏  ›  技术社区  ›  Ken Earley

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

  •  5
  • Ken Earley  · 技术社区  · 14 年前

    这是我构造对象的典型方式:

    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运行这个函数时,它给出了一个错误,指出我的两个私有函数是“隐含全局函数”

    我能想到的最好办法是在顶部用如下变量声明我的函数:

    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);
        }
      };
    }
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   Matthew Flaschen    14 年前

    我很确定这是JSLint中的一个bug。它还没看到 setId 然而,它假设它是全球性的。但实际上,这没什么区别,因为 var ECMAScript 5 10.5 在任何地方 undefined 价值观。但是当函数(例如init)实际运行时,closed-in值不再是 未定义

    去看看吧 集合ID 最初未定义,但从未引用全局,请执行以下测试:

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

    TypeError 错误。

        2
  •  3
  •   gradbot    14 年前

    JSLint希望在init中引用setId之前先定义它。

    这将通过JSLint。

    function gizmo(id) {
    
      /* private variables */
    
      var myId = id;
    
      /* private methods */
    
      var setId = function (newId) {
        myId = newId;
      };
    
      var init = function () {
        if (myId < 1) {
          setId(1);
        }
      };
    
      // run 'constructor'
      init();
    
      /* public methods */
    
      return {
        getId: function () {
          return myId;
        },
        setId: function (newId) {
          setId(newId);
        },
        incrementId: function (inc) {
          setId(myId + inc);
        }
      };
    }
    
        3
  •  0
  •   Rich    14 年前

    我不知道JSlint,但是在阅读了“javascript的好部分”之后,我总是将对象声明为文本。

    如:

    Mogwai={
      has_crazy_thoughts:True,
      reacts_to_water:True,
      name: 'Gizmo',
      eat:function(food){
        // code
      },
      become_gremlin:function(){
        // code
      },
      cause_havoc:function(){
        // code
      }
    }
    

    编辑:我强烈推荐上面提到的书(没有附属机构): http://oreilly.com/catalog/9780596517748 ... 它是由道格拉斯·克罗克福德写的,他给我们带来了JSlint。

        4
  •  0
  •   TNi    14 年前

    我已经有很长一段时间(几年)没有认真编写JavaScript了,所以我对最佳实践细节的记忆已经一去不复返了。我所做的是回到过去,挖掘出一些可以帮助你做出明智决定的资源。

    首先,您创建对象的方式似乎很让人想起 Module Pattern instantiate your objects . 那篇文章给了你一个稍微不同的看法。