从其外部更改变量

时间:2016-04-15 20:58:59

标签: javascript node.js function scope

function get_all_channels_by_order(){
    var foobar = false

    mysql_connection.connect()
    mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", function(){
        foobar = true
    })
    mysql_connection.end()
    console.log(foobar)
}

我需要foobar才能返回true,而是返回false。 这当然归功于JavaScript范围,但我想知道有没有办法克服这个问题?或者这是不可能的?

我很遗憾地提出这样一个常见问题,但是我已经查看了其他几个Stack Overflow问题并且他们没有帮助,我也尝试了很多其他代码而不是这个但没有成功。

1 个答案:

答案 0 :(得分:0)

编辑:虽然我的回答是正确的,但显然OP的真正问题是他在回调之前试图访问一个被回调修改的变量。

尝试以下代码。我创建了一个名为'that'的变量,它存储了对你所在范围的引用。然后,每当我想要正确的foobar时,我只在它前面添加“那个”。

var mysql_connection = {};
mysql_connection.connect = function(){
   console.log("call to mysql_connection.connect");
}

mysql_connection.query = function(query,cb){
   console.log("call to mysql_connection.query with query of",query);
   if(cb){
      cb();
   }
}
mysql_connection.end = function(){
   console.log("call to mysql_connection.end");
}

function get_all_channels_by_order(){
    var that = this;
    that.foobar = false;
    console.log("foobar=",that.foobar);

    mysql_connection.connect()
    mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", function(){
        that.foobar = true
    })
    mysql_connection.end()
    console.log("foobar=",that.foobar);
}