Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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全局变量和返回值_Javascript - Fatal编程技术网

javascript全局变量和返回值

javascript全局变量和返回值,javascript,Javascript,我编写了以下代码,但它并没有返回tDate值,接收到未定义的错误。 log显示了结果,我想我使用全局变量的方式是错误的。 似乎在循环之后,tDate仍然没有启动,在循环内部它正在接收值我如何定义全局变量 function getDates(){ var tDate; var pool = new ConnectionPool(poolConfig, config); pool.requestConnection(function (err, connection) {

我编写了以下代码,但它并没有返回tDate值,接收到未定义的错误。 log显示了结果,我想我使用全局变量的方式是错误的。 似乎在循环之后,tDate仍然没有启动,在循环内部它正在接收值我如何定义全局变量

function getDates(){
    var tDate;
    var pool = new ConnectionPool(poolConfig, config);

    pool.requestConnection(function (err, connection) {
        if(!err) {
            var sql = "SELECT MAX(Date) from datatable";
            var request = new Request(sql, function(err, rowCount) {
                if (err) {
                    console.log(err);
                }

                // Release the connection back to the pool.
                connection.close();
            });

            request.on('row', function(columns) {
                columns.forEach(function(column) {
                    if (column.value === null) {
                        console.log('NULL');
                    } else {
                        var date = column.value;
                        var sDate = new Date(date);
                        sDate = sDate.toISOString().slice(0,10);
                        tDate = 'Today= ' + sDate;
                        console.log(tDate);
                    }
                });
            });

            connection.on('connect', function(err) {
                connection.execSql(request);
            });
        }
    });
    return tDate;
}

你犯了一个典型的错误,你写的代码将按照你看到的顺序执行。不会的。您是绑定事件监听器,如果发生什么事情,它将调用回调函数。只有在request.on'row'回调中,才会修改tDate的值

请求在很大程度上是异步操作,可以这样想:

function testCallback()
{
    var someVar = 213;
    setTimeout(function()
    {
        someVar = 'New value';
    }, 10000);//10 seconds
    return someVar;
}
console.log(testCallback());
这不会花费10秒来记录,而是几乎立即记录213,但10秒后,现在无法访问的变量someVar将被重新分配

您可以通过执行以下操作进行测试:

function testCallback()
{
    var valObj = {someVal: 213};
    setTimeout(function()
    {
        valObj.someVal = 'new value';
    }, 10000);
    return valObj;
}
var o = testCallback();
console.log(o.someVal);//213, still
// wait 10 seconds
console.log(o.someVal);//new value <--

你想过SQL注入吗?Johan你什么意思?这段代码正在服务器上运行,有什么建议吗?日期是多少?给定var sDate=new Datedate,它很可能是一个字符串,在这种情况下,强烈建议不要使用new Datedate。使用日期构造函数解析字符串是非常不可靠的,特别是如果您使用的ISO字符串没有时区,如sDate.toISOString.slice0,10所示。目前要求这些字符串是本地的,需要UTC。好吧,如果有人复制您的脚本并用DROP TABLE datatable替换SELECT MAXDate from datatable、SELECT*from information_schema.tables等,这并不难。hmmm看起来我有很多问题:谢谢大家的建议+1,此外,我还要检查column.value是否是有效的日期值—可以转换为日期的字符串。但是为了让它工作,我认为你的答案是正确的。@davidkonrad字符串根本不应该传递给日期构造函数。他们的格式应该是已知的,应该手动解析。我是JS新手,我是c,c程序员。谢谢你的建议,我会尽力解决这个问题。@zevsuld:在编写JS时,有一件事你应该时刻牢记在心,那就是函数式编程语言。相应地对待它。在函数中思考,而不是在语句中思考。如果你那样做,你会没事的