0

我正在尝试将我的一个中型 JavaScript API 从“大量全局变量和函数”转换为更类似于 jQuery 和其他经过深思熟虑的 JavaScript 库中使用的命名空间封装的东西。为了实现这一点,我使用了匿名函数。

这是代码的片段:

(function(window, undefined) {
    var MyLib = (function() {
        var AbortProgram = true;
        function DisplayAbortProgram() { alert('AbortProgram inside=' + AbortProgram); }
        return { AbortProgram: AbortProgram, DisplayAbortProgram: DisplayAbortProgram }
    } ())
    window.MyLib = MyLib;
})(window);

MyLib.AbortProgram = false;
alert('AbortProgram outside=' + MyLib.AbortProgram);
MyLib.DisplayAbortProgram();

运行时,AbortProgram 的外部值为 false,但内部值为 true。这篇文章是为了确认发生这种情况的原因?我相信这是因为 return 语句返回的是 DisplayAbortProgram 的值,而不是对它的引用。根本原因是 JavaScript 返回原始类型的值而不是引用 - 对象是通过引用传递的。

我已经阅读了这一点,并相信没有办法返回对该布尔变量的引用,因此我必须实现一个名为 SetAbortProgram(value) 的函数。

4

3 回答 3

2

您是正确的,它是按值传递而不是引用。创建一个参数对象。这将通过引用传递:

 var args = { AbortProgram: true };

绕过args而不是AbortProgram. 您可以通过访问您的布尔值args.AbortProgram

于 2013-01-19T19:12:12.693 回答
2

AbortProgram被关闭隐藏,你不能改变它。这通常是您使用的模式的目标。

您所做MyLib.AbortProgram = false;的不是更改现有的隐藏变量,而是添加一个新AbortProgram变量。

如果您想AbortProgram修改,请将您的代码简化为

var MyLib = {
        AbortProgram: true,
        DisplayAbortProgram: function DisplayAbortProgram() { alert('AbortProgram inside=' + this.AbortProgram); }
};

MyLib.AbortProgram = false;
MyLib.DisplayAbortProgram();

或者在现有代码中添加一个 setter:

(function(window, undefined) {
    var MyLib = (function() {
        var AbortProgram = true;
        function DisplayAbortProgram() { alert('AbortProgram inside=' + AbortProgram); }
        function setAbortProgram(v) {AbortProgram=v}
        return { AbortProgram: AbortProgram, DisplayAbortProgram: DisplayAbortProgram, setAbortProgram:setAbortProgram}
    } ())
    window.MyLib = MyLib;
})(window);

MyLib.setAbortProgram(false);
alert('AbortProgram outside=' + MyLib.AbortProgram);
MyLib.DisplayAbortProgram();
于 2013-01-19T19:13:42.207 回答
1

根本原因是 JavaScript 返回某些原始类型的值而不是引用。

不只是一些。所有原始类型都将作为值传递。只有对象是对其属性的引用。

我已经阅读了这一点,并相信没有办法返回对该布尔变量的引用,因此我必须实现一个名为 SetAbortProgram(value) 的函数。

是的,如果你想改变变量。然而,你可以在任何地方使用你的对象的属性。

于 2013-01-19T19:14:15.967 回答