javascript - javascript函数的设置状态不保存

标签 javascript namespaces closures

我正在尝试创建一个新函数 MyNs.MyObj(),调用它的一个方法来修改“私有(private)”变量“prop1”,并且下次我访问公共(public)访问器“Prop1”时检索保存的变量。

运行以下代码后,输出仍然是“2”(初始值)。有人可以帮助我理解为什么调用 Method 函数没有按照我期望的方式更新 Prop1 变量吗?

var MyNs = MyNs || {};

(function( o ){
    o.MyObj = function (options) {
        var prop1 = options;

        var obj = {
            Prop1: prop1,
            Method: function() { 
                prop1 = "abc";
            }
        };

        return obj;
    };
})(MyNs);

var s = new MyNs.MyObj(2);
s.Method();

console.log(s.Prop1);

最佳答案

当你这样做时

var prop1 = options;

var obj = {
    Prop1: prop1
};

您已设置 Prop1值为 prop1那时,改变prop1以后不会更新Prop1 .
您可以使用类似的内容轻松测试

var a = 'abc'; // set a value on 'a'
var b = a;     // set 'b' to equal 'a', as it's a string, it's passed directly

a = 'bca';     // set a new value for 'a'

alert(b);      // still outputs 'abc'

FIDDLE

这意味着您必须更新属性,而不是变量,并且您可以这样做

var MyNs = MyNs || {};

(function( o ){
    o.MyObj = function (options) {
        var prop1 = options;

        var obj = {
            Prop1: prop1,
            Method: function() { 
                this.Prop1 = "abc";
            }
        };

        return obj;
    };
})(MyNs);

var s = new MyNs.MyObj(2);
s.Method();

console.log(s.Prop1);

FIDDLE

关于javascript - javascript函数的设置状态不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22302079/

相关文章:

php - 有没有办法测试闭包是否也是生成器?

javascript - 从 iframe 间接调用的 Fancybox 2.1.3 返回 'The requested content cannot be loaded. Please try again later.'

JavaScript - 循环遍历图像目录数组并将它们应用到图像

namespaces - 如何在 Elixir Phoenix iex 控制台中停止强制模块命名空间?

ios - Swift 闭包内存使用

closures - 为什么嵌套迭代器闭包不会从外部范围复制值

javascript - Vue js错误: Component template should contain exactly one root element

javascript - for 循环中元素的批量分配

c++ - 运算符重载和命名空间

c++ - 为什么我的日志在 std 命名空间中?