JavaScript布尔值作为值返回,而不是引用

时间:2013-01-19 19:08:49

标签: javascript pass-by-reference

我正在尝试将我的一个中型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)的函数。

3 个答案:

答案 0 :(得分:2)

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

 var args = { AbortProgram: true };

args而不是AbortProgram。您可以通过args.AbortProgram

访问您的布尔值

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

答案 2 :(得分:1)

  

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

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

  

我已经读过这篇文章,并且相信没有办法返回对该布尔变量的引用,所以我将不得不实现一个名为SetAbortProgram(value)的函数。

是的,如果您想更改变量。但是,您可以随处使用对象的属性。