【问题标题】:JavaScript booleans are returned as values, not referencesJavaScript 布尔值作为值返回,而不是引用
【发布时间】:2013-01-03 06:42:31
【问题描述】:

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

【问题讨论】:

    标签: javascript pass-by-reference


    【解决方案1】:

    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】:

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

       var args = { AbortProgram: true };
      

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

      【讨论】:

        【解决方案3】:

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

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

        我已阅读此内容,并认为无法返回对该布尔变量的引用,因此我必须实现一个名为 SetAbortProgram(value) 的函数。

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

        【讨论】:

        • 我已经编辑了问题以删除与原语相关的“一些”
        猜你喜欢
        • 2015-02-19
        • 2017-04-22
        • 2020-02-13
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        • 1970-01-01
        相关资源
        最近更新 更多