JavaScript布尔值作为值返回,而不是作为引用返回
JavaScript booleans are returned as values, not references
我正在尝试将我的一个中等大小的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)的函数。
是的,如果你想改变变量。但是,您可以在任何地方使用对象的属性。
- 返回 JavaScript 类值而不是对象引用
- 为什么根据括号的位置来引用窗口或对象?并返回undefined
- 表单验证返回引用错误
- 在Angularjs服务中为返回对象引用的http请求提供的数据构建简单的缓存
- _.find 是否返回对对象的引用?如何正确设置结果的属性
- getValues() 从包含引用的单元格中检索值时返回 0.0
- 在 JavaScript 中,如何从更深层次的嵌套方法引用方法的返回值
- 为什么在 JavaScript 中引用对象的不存在属性不会返回引用错误
- 执行 Backbone where 和 findWhere 按值或引用返回模型
- 如何在 javascript 中引用从像 bottle 这样的 Web 框架返回的数据
- 引用变量,它执行函数,但是向变量中添加字符串,将函数作为字符串而不是值返回
- 挖空扩展可观察 取消引用时返回未定义
- 为什么角度返回带有引用错误:ngResource 未定义
- 茉莉花测试返回错误“未捕获的引用错误:未定义要求”
- 返回的Javascript VM对象具有错误的引用
- 为什么要求始终返回具有新内部引用的新对象
- ===当两个引用都应该指向同一个对象时,在Nashorn中返回false
- OOP getter函数应该返回私有属性的值或引用
- Javascript中带括号的表达式是否返回引用
- 相当于php's在javascript中返回引用