Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未保存javascript函数的设置状态_Javascript_Namespaces_Closures - Fatal编程技术网

未保存javascript函数的设置状态

未保存javascript函数的设置状态,javascript,namespaces,closures,Javascript,Namespaces,Closures,我正在尝试创建一个新函数MyNs.MyObj,对其调用一个修改“private”变量“prop1”的方法,下次访问公共访问器“prop1”时,它将检索保存的变量 运行下面的代码后,输出仍然是初始值“2”。有人能帮我理解为什么调用Method函数并没有像我期望的那样使用Prop1变量吗 var MyNs = MyNs || {}; (function( o ){ o.MyObj = function (options) { var prop1 = options;

我正在尝试创建一个新函数MyNs.MyObj,对其调用一个修改“private”变量“prop1”的方法,下次访问公共访问器“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'
这意味着您必须更新属性,而不是变量,您可以这样做

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);

您没有引用您认为自己是什么,在方法内部您必须使用this.Prop1来更改该属性,现在您只是创建一个新的全局。谢谢,这很有意义。