Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从外部更改变量';s范围_Javascript_Node.js_Function_Scope - Fatal编程技术网

Javascript 从外部更改变量';s范围

Javascript 从外部更改变量';s范围,javascript,node.js,function,scope,Javascript,Node.js,Function,Scope,我需要foobar返回true,但它会返回false。 这当然是由于JavaScript的作用域,但我想知道有什么方法可以克服这个问题?还是不可能 我很抱歉问这样一个常见的问题,但我已经研究了其他几个堆栈溢出问题,它们没有帮助,我也尝试了许多其他代码,但没有成功。编辑:虽然我的答案是正确的,显然,OP的真正问题在于,他试图在回调返回之前访问一个被回调修改的变量 请尝试下面的代码。我创建了一个名为“that”的变量,它存储对您所在范围的引用。然后,每次我想要正确的foobar,我只是在它前面加上“

我需要
foobar
返回
true
,但它会返回
false
。 这当然是由于JavaScript的作用域,但我想知道有什么方法可以克服这个问题?还是不可能


我很抱歉问这样一个常见的问题,但我已经研究了其他几个堆栈溢出问题,它们没有帮助,我也尝试了许多其他代码,但没有成功。

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

请尝试下面的代码。我创建了一个名为“that”的变量,它存储对您所在范围的引用。然后,每次我想要正确的foobar,我只是在它前面加上“that”


刚试过这个,仍然返回false。然后呢?您的代码仍然打印
foobar=false
。在查询完成之前,您正在关闭连接。冷静。我假设是同步的。写之前先阅读编辑。我的代码日志是真的。注意,我定义了mysql方法
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)
}
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);
}