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

JavaScript booleans are returned as values, not references

本文关键字:返回 引用 JavaScript 布尔值      更新时间:2023-09-26

我正在尝试将我的一个中等大小的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。这篇文章是为了证实为什么会发生这种情况?我相信这是因为返回语句返回DisplayAbortProgram的值,而不是对它的引用。潜在的原因是JavaScript返回基本类型的值,而不是引用——对象是通过引用传递的。

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

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

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

 var args = { AbortProgram: true };

传递args而不是AbortProgram。您可以通过args.AbortProgram访问布尔值

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

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

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

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