3

かなり単純な質問だと思いますが、答えが見つからないものです。関数をグループ化するために作成したオブジェクト リテラルがあります。オブジェクト リテラル内にあり、そのオブジェクト リテラル内のすべての関数から編集可能/アクセス可能な変数を作成する方法を知りたいです。現時点でこれを行う方法を知っている唯一の方法は、グローバル変数を作成することですが、この方法でグローバル変数を設定するのをやめたいと思っています。私がフィドルを見ているものをよりよく説明するために

http://jsfiddle.net/aT3J6/

助けてくれてありがとう。

var clickCount = 0;

/* I would like to place clickCount inside hideShowFn Object but all function inside need access to it, so global within hideShowFn */

hideShowFn = {
    init:function(){  
     $('.clickMe').click(this.addToCount);                
    },

addToCount:function(){
    clickCount++;
    $('<p>'+ clickCount + '</p>').appendTo('body');
    }
}

hideShowFn.init(); 
4

3 に答える 3

2

次のように、関数内にプライベート変数を使用して、すぐに呼び出されてオブジェクトを返す関数を作成します。

var obj = (function () {
    var privateStuff = 'private';
    return {
        func1: function () { 
            //do stuff with private variable
        },
        func2: function () {
            //do stuff with private variable
        }
    };
}());

http://jsfiddle.net/BE3WZ/

これは、関数型プログラミングでプライベート変数を使用する方法です。

于 2012-08-13T21:22:07.607 に答える
2

http://jsfiddle.net/mattblancarte/aT3J6/10/

別のオプションは、疑似古典的なスタイルです。

function Constructor(){
  var private = 'private';
  this.public = 'public';

  this.methods = {
    //your methods here...
  };
}

var obj = new Constructor();

「new」キーワードを使用することを忘れないでください。そうしないと、グローバル スコープになります。

このスタイルに変換されたコードは次のようになります。

function Test(){
  var that = this,
      clickCount = 0;

  this.init = function(){
    $('.clickMe').click(this.addToCount);
  };

  this.addToCount = function(){
    clickCount++;
    $('<p>'+ clickCount + '</p>').appendTo('body');
  };
}

var test = new Test();
test.init();
于 2012-08-13T21:26:30.270 に答える
1

Cokegodが言うようにクロージャーを作成するか、単に変数をオブジェクトに追加して、this

hideShowFn = {
    clickCount: 0,
    init:function(){  
        $('.clickMe').click(this.addToCount);                
    },
    addToCount:function(){
        this.clickCount++;
        $('<p>'+ this.clickCount + '</p>').appendTo('body');
    }
}

hideShowFn.init();

これは、Musa がスコープがaddToCountクリックされた dom ノードになると言っているため、機能しません。

しかし、Cokegod の回答を参照してください。

于 2012-08-13T21:25:07.413 に答える