2

「プライベートフィールド」を外の世界に返すとき、私は明らかにモジュールパターンにかなり混乱しています。ここにコードがあります、

    var vm2 = (function(){
    var 
        name = 'sean',
        changename = function(v){
            this.name=v;
        };

    return {
        name: name,
        foo: name,
        changename:changename
    };
}());

vm2.changename('jasper');
console.log(vm2.name);
console.log(vm2.foo);

vm2.fooがまだ「sean」であるのに、vm2.nameは「jasper」であるという結果に混乱しました。誰かがそれを理解するのを手伝ってくれますか?

4

2 に答える 2

1

「changename」関数は、オブジェクトの「name」プロパティのみを更新します。クロージャーに存在する「name」というローカル変数をいじったり、「foo」をいじったりしません。したがって、オブジェクトの「foo」プロパティは、「changename」に何を渡しても初期値を保持します。

ステップバイステップ:

  1. 変数「vm2」は、その無名関数によって初期化されます。その値は、3 つのプロパティを持つオブジェクトです。
  2. 「changename」関数の呼び出しは、「vm2」のプロパティ参照を介して行われます。これによりthis、「changename」の実行中にそのオブジェクトにバインドされます。
  3. 「changename」内では、参照されるオブジェクトthis(「vm2」オブジェクト) の「name」プロパティが、パラメーターとして渡された値に更新されます。

「vm2」が初期化されると、そのコードの何も「foo」に触れないことに注意してください。

于 2013-09-07T14:45:47.613 に答える
0

このケースはどうですか?なぜその人はまだ私的な人なのですか?

var vm = (function () {
        var person = { name: "jasper" };
        var changename = function (v) {
            //person.name = v;
            person = { };
        };

        return {
            person: person,
            changename: changename
        };
    })();

    vm.changename("sean");
    alert(vm.person.name);
于 2013-09-07T15:57:55.057 に答える