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.name 是“jasper”,而 vm2.foo 仍然是“sean”,有人可以帮我理解吗?

4

2 回答 2

1

“changename”函数只更新对象的“name”属性;它不会与闭包中存在的名为“name”的局部变量混淆,也不会与“foo”混淆。因此,无论您将什么传递给“changename”,对象的“foo”属性都会保留它的初始值。

所以一步一步:

  1. 变量“vm2”由该匿名函数初始化。它的值是一个具有三个属性的对象。
  2. 通过“vm2”上的属性引用调用“changename”函数。这将导致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 回答