2016-04-22 7 views
0

私はいくつかのパブリックメソッドといくつかのプライベートメソッドを持つクラスを持っています。パブリックメソッドは "this"にバインドされ、プライベートメソッドは "var"を使用します。JS名前空間スコープ: "var"関数内の "this"は "window"と評価されます

私はクラスの外部からパブリックメソッド "do()"を呼び出し、 "this"は "MyClass"と評価します。しかし、私がさらにprivate( "something()"メソッドを呼び出すと、 "this"はグローバル名前空間 "Window"に評価されます。

function MyClass() { 
    // private field 
    var keys = ["foo", "bar"]; 

    // public method 
    this.method = function(key) { 
     alert(key); 
    } 

    // private method 
    var something = function() { 
     console.log("something()"); 
     console.log(this); 
     $.each(keys, function(idx, key){ 
      this.method(key); 
     }.bind(this)); 
    } 

    // public method 
    this.do = function() { 
     console.log("do()"); 
     console.log(this); 
     something(); 
    } 
} 

var test = new MyClass(); 
test.do(); 

フィドル、上記コード:https://jsfiddle.net/lilalinux/13m242ce/8/

私はそれを理解するように、(コンストラクタの内部に割り当てられる)this.doが「特権」機能であり、そのようなものとしてクラス外部から呼び出し可能であるべきであり、そしてprivateメンバー(varsとコンストラクターのパラメーター)にアクセスできるようにする必要があります。

+2

'something'は' MyClass'のインスタンスにassocatedない "自由" 機能、です。 –

+0

"var"や "this"のいずれも使用しないと、 "フリー"な機能だと思っていました。 "var"ではプライベートメソッドのようなものですか?プライベートメソッドを宣言するにはどうすればよいですか? – lilalinux

+2

'var self = this'または' var something = function(){} .bind(this) 'です。 – dfsq

答えて

1

somethingMyClassと直接関連付けられていないため、そのthis値はMyClassインスタンスを参照しません。代わりにの参照をsomethingの外に割り当てて、プライベート関数内のその変数を参照する必要があります。このような

何か:

function MyClass() { 
    var self = this; // <-- keep the reference 

    // ... 

    // private method 
    var something = function() { 
     console.log("something()"); 
     console.log(self); 
     $.each(keys, function(idx, key){ 
      self.method(key); 
     }.bind(self)); 
    } 

    // ... 
} 
+1

strictモードを使用することも考えられます。これは、変数が暗黙的に 'window'オブジェクトにアタッチされないようにします。あなたのjavascriptファイルの上に '' use strict '; 'と入力するだけです。 – DrinkBird

+0

@DrinkBirdそれは宣言されていない変数の唯一の懸案事項です。 'something = function(){..}'( 'var'宣言なし)は暗黙のグローバルを作成し、' this'は自動的に 'window'に設定されます。この種のコードで唯一異なる厳密なモードは、関数がバインドされていない場合、 'this'は' undefined'になります。 –

+0

明確にしてくれてありがとう、私はそれを知っています、私はちょうど 'var'キーワードを忘れて、誤って' window'に何かをつけているので、より一般的なルールとして言いました。 – DrinkBird

関連する問題