2

私はJSに不慣れで、いくつかの新しいシンに遭遇しました。たとえば、私はこのコードを見ました:

function baz() {
    var x = 1;
    return {
        foo: function foo() {return ++x},
        bar: function foo() {return --x},
    };
}

var closures = baz();
alert(closures.foo(),closures.bar());

共有変数を表示することになっています。私の質問は-何が返されるのですか?

foo()とbar()の2つの関数を持つ単なるオブジェクトですか?ありがとう

ヨタム

4

4 に答える 4

4

はい、それは「単にfoo()とbar()の2つの関数を持つオブジェクト」です。

しかし、この関数はクロージャーでも宣言されています。つまり、このプライベートプロパティxを持つことができます。

  • 両方の機能で表示および変更可能
  • それ以外の方法で読み取ったり変更したりすることはできません

との主な違い

var x = 1;
var closures = {
    foo: function() {return ++x},
    bar: function() {return --x},
};

それは

  • xは、オブジェクトを作成するクロージャーによって保護されます
  • xに関して名前の競合が発生することはなく、グローバル名前空間が乱雑になることもありません。
于 2012-12-04T09:20:27.127 に答える
3

この関数は、2つのプロパティ(および)bazを持つオブジェクトを返します。これらの2つのプロパティの値は関数です(どちらも同じ変数の値を変更して返します)。foobarx

于 2012-12-04T09:19:35.070 に答える
1

foo()これらのプロパティには表示どおりの名前が付けられ、これらの関数は匿名にすることもできるため 、Yoはafter関数を省略できます。return { var foo: function() {return ++x}, var bar: function() {return --x}, };

したがって、関数であるプロパティを持つオブジェクトがあります。

于 2012-12-04T09:23:41.793 に答える
0

この関数bazは変数xを1に設定してから、オブジェクトを返します。このオブジェクトには、2つのフィールドがあります。1つはでfooあり、もう1つはbarです。オブジェクトについて少し簡単に言うと、フィールドにアクセスしたい場合は、を呼び出すだけですobject.fieldname。これについては後で詳しく説明します。

機能foobarはかなりシンプルです。++ xと--xがここで何をするのかわからない場合は、Stackoverflowの良い質問です。

C++でのインクリメント-いつx++または++xを使用しますか?

基本的には、ステートメントを実行してからxをインクリメントまたはデクリメントすると言っています。xを返しているので、1を返し、xをインクリメントまたはデクリメントすると思います。

関数の最後に、呼び出される変数closuresが定義されます。これは、関数から返されるオブジェクトです。前に言ったように、フィールドにアクセスするために必要なのはobject.fieldname、この場合はclosures.foo()or closures.bar()(関数を実行するために括弧が必要です)を実行することだけです。

テストしたところ、アラートに2が表示されました。理由は、構文が理解されていないためalert(int,int)、最初のアラートのみが表示されているためだと思います。

于 2012-12-04T09:30:00.570 に答える