【发布时间】:2016-07-15 06:32:12
【问题描述】:
我正在编写一个 javascript 应用程序,我想在全局范围内访问我的应用程序变量。像这样的:
//Initialize
var myApp=new app();
//Count is zero here, as expected since app is asynchronous
console.log(myApp.count);
//But 5 seconds later, count should have a non-zero value
setTimeout(function(){
console.log(myApp.count);
}, 5000);
以及应用代码:
//Application code
function app() {
var count=0;
setTimeout(function(){
console.log("Setting count to 10");
count=10;
}, 2500);
//Member variable for count
this.count=count;
}
在此处查看 jsfiddle: https://jsfiddle.net/o4db2ep4/
我想要的是 count 的第一次访问为零,但第二次访问应该是 10。
我认为正在发生的事情是,在我声明 myApp 时,它的 count 值为零。这就像一个传递值/引用问题与范围相结合,我正在努力解决这个问题。
如何获得对 app.count 的动态引用,即始终包含 count 的当前值,而不是分配时的值?如果这不可能,我应该如何重新考虑这个问题?
【问题讨论】:
-
setTimeout不会暂停脚本。它只是安排您提供的函数稍后运行,因此this.count = count在setTimeout回调执行之前很久就执行了。 -
是的,我明白这一点。但是,如果 app.count 是指向 this.count 的指针,那么它们将始终引用相同的值,而不管何时运行。
-
JavaScript 严格按值传递/分配。一个变量/属性不能引用另一个变量/属性。
-
嗯,严格来说这并不正确,因为对于对象数组,数组内容是通过引用(而不是值)分配的。因此需要深拷贝、slice() 等。
-
@jrel:您将对象引用与传递引用混淆了。这是一个常见的错误。通过引用传递/分配只是关于绑定如何相互关联,而不是值。
标签: javascript asynchronous scope pass-by-reference