Javascript揭示模块,返回私有字段

时间:2013-09-07 14:44:11

标签: javascript

当我将“私人领域”归还给外界时,我很惊讶于揭示模块模式。 这是代码,

    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', 有人可以帮我理解吗?

2 个答案:

答案 0 :(得分:1)

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

一步一步:

  1. 变量“vm2”由该匿名函数初始化。它的值是一个具有三个属性的对象。
  2. 对“changename”函数的调用是通过“vm2”上的属性引用进行的。当“changename”执行时,这将导致this绑定到该对象。
  3. 在“changename”内,this引用的对象的“name”属性(即“vm2”对象)将更新为传递给参数的任何值。
  4. 请注意,一旦初始化“vm2”,该代码中的任何内容都不会触及“foo”。

答案 1 :(得分: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);