11

私は2つの理由から、Javascriptでオブジェクト指向のアプローチを取っています。1つは学習に役立つため、2つはコードを配布する場合に備えてです。

私はすでに変数に関数を割り当てthis、パブリック変数に使用しています。thisただし、使用中に問題が発生しています。「プライベート」関数を使用しているときにthis、別のスコープを参照し、の下の変数にアクセスできませんthis。私のポイントを説明します。

var ClassObject = function() {
  this.var1 = 'Hello';

  var var2 = 786;

  this.func1 = function() {
    alert(this.var1); // Alerts Hello
    alert(var2); // Alerts 786
  }

  var func2 = function() {
    alert(this.var1); // Alerts undefined
    alert(var2); // Alerts 786
  }
}

func2アクセスを許可する唯一の方法はthis.var1、別の変数をthis:に割り当てることvar c = thisでした。これは、このタスクを実行するための最良の方法ですか、それとも広く受け入れられますか?誰かがより良い解決策を提供できますか?

皆さん、ありがとうございました。

4

3 に答える 3

9

はい、これは受け入れられている慣行です。スコープまたはこの質問については、この記事を参照してください。

閉鎖について読むことも役立つかもしれません。

于 2012-08-08T05:18:14.943 に答える
3

の値はthis、プライベート関数を呼び出すときを含め、すべての関数呼び出しでjavascriptインタープリターによって設定されます。ルールはかなり単純です:

  1. を呼び出すとobject.method()thisメソッド内のオブジェクトに設定されます。
  2. のような通常の関数(グローバルまたはローカル)を呼び出す場合はfn()thisグローバルオブジェクト(通常windowはブラウザにあります)に設定されます。
  3. .apply()またはを使用する場合.call()、これらの関数の最初の引数に設定されます(たとえば、またはthisに渡すものによって設定内容を制御できます。.apply().call()

したがって、プライベート関数を呼び出すと、オプション2が表示されますthis。オブジェクトのにアクセスする場合は、次の3つのオプションがあります。

  1. それらのプライベート関数メソッドを作成し(その時点ではプライベートではなくなります)this.func2()、javascriptインタープリターが設定するようなメソッドとして呼び出しthisます。
  2. .call()またはを使用して、インタプリタに希望どおりに設定する.apply()ように指示します。func2.call(this)this
  3. の値をローカル変数に格納してから、のようなものthisで呼び出すと、クロージャーを介して内部を参照できます。これはjavascriptで非常に一般的に行われます(クロージャが親スコープ変数へのアクセスを許可する方法を利用します)。func1()var self = thisselffunc1()
于 2012-08-08T05:21:48.213 に答える
0

別の変数に設定するようなものを使用しない限り、やりたいことを行うことはできません。したがって、すべてを再構築して実行する必要がないようにするか、変数を使用するだけです。変数を使用しても問題ないと思います

于 2012-08-08T05:12:23.367 に答える