【问题标题】:Javascript access member variables by referenceJavascript 通过引用访问成员变量
【发布时间】: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 = countsetTimeout 回调执行之前很久就执行了。
  • 是的,我明白这一点。但是,如果 app.count 是指向 this.count 的指针,那么它们将始终引用相同的值,而不管何时运行。
  • JavaScript 严格按值传递/分配。一个变量/属性不能引用另一个变量/属性。
  • 嗯,严格来说这并不正确,因为对于对象数组,数组内容是通过引用(而不是值)分配的。因此需要深拷贝、slice() 等。
  • @jrel:您将对象引用与传递引用混淆了。这是一个常见的错误。通过引用传递/分配只是关于绑定如何相互关联,而不是

标签: javascript asynchronous scope pass-by-reference


【解决方案1】:

发生的情况是countthis.count 是不同的变量,它们并不神奇地同步。一旦你分配了它,它就是一次性的。当它被分配this.count=count=0;超时将在 2500 毫秒后发生,此时您要更新的是 this.count

function app() {

    this.count = 0;

    setTimeout(function(){ 
        console.log("Setting count to 10");
        this.count = 10;
    }.bind(this), 2500);
}

如上所示,您不需要这两个变量。

【讨论】:

  • 谢谢,这很有帮助。真正发挥作用的是 .bind(this) ,这解决了问题。但我不得不承认我不确定它到底在做什么。
【解决方案2】:

这个怎么样:

//Initialize 
var myApp=new app();
myApp.increment(myApp);

//Count is zero here, as expected since app is asynchronous
console.log(myApp.count);

//But 5 seconds later, count does have a non-zero value
setTimeout(function(){ 
     console.log(myApp.count); 
}, 5000);


//Application code
function app() {

    this.count=0;

    this.increment = function(obj) {
      setTimeout(function(){ 
          console.log("Setting count to 10");
          if (typeof(obj.count)=='undefined') { obj.count=0;}
          obj.count+=10;
      }, 2500);    
    }
}

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多