美文网首页
JS回调函数中无法改变外部变量的问题

JS回调函数中无法改变外部变量的问题

作者: JacobMa1996 | 来源:发表于2017-07-26 10:36 被阅读0次

今天又遇到了上次的问题,上次只是找了个方法解决,没有搞清楚原理;

router.get('/', function (req, res, next) {

    var abc;

    Article.findArticle({}, function (err, res) {
        if (err) {
            console.log(err);
        } else {
            //操作查询出的文章
            abc = res;
        }
    });

    console.log(abc);//undefined

    res.render('blog/blog', {
        title:'BLOG',
        article:JSON.stringify(abc)
    });
});

在express中,查询数据库中的数据,后通过回调函数传递给全局变量,从而渲染到EJS模板,按以上写法是无法将res赋值给abc的,或者说,赋值给了abc,但是对abc的操作是在赋值之前的。
一开始我以为是变量的定义问题,后来发现,全都定义为全局变量也不行;
然后我突然发现,这其实是回调函数异步执行的问题;
看以下代码:

window.onload = function(){
        function fn1(callback) {
            setTimeout(function(){
                console.log(1);
            },100);
            callback();
        };

        function fn2() {
            console.log(2);
        }

        fn1(fn2);
        fn2();
    }

结果是221
console.log(1)在100毫秒后执行,他后面的代码都执行完了,他才会执行,在这里,延时100毫秒,就相当于查询数据库所需要的时间,数据还未查询到,abc=res就无法执行,当这句代码执行时,后面的操作已经执行完了,但是我们已经看不到了;
因为在整个代码执行流中,JS的异步机制,决定了他无法等待上一步的执行结果,如果时间稍长(比如需要查询数据库),就只能以一个异步的执行流去写代码。
要注意摒弃同步的思想。

相关文章

  • JS回调函数中无法改变外部变量的问题

    今天又遇到了上次的问题,上次只是找了个方法解决,没有搞清楚原理; 在express中,查询数据库中的数据,后通过回...

  • 2018-11-12

    全局变量和局部变量 JS函数内部可以直接读取全局变量 但函数外部无法读取函数内部的局部变量 从外部读取函数内部的 ...

  • 闭包以及匿名函数

    闭包是什么? 背景:js中,无法从一个函数体外读取函数体内的变量,却可以从函数体内读取外部的变量。 2,闭包用处:...

  • JavaScript闭包

    特殊的变量作用域js变量的作用域有:全局变量和局部变量。函数内部可以直接读取全局变量,函数外部无法读取函数内的局部...

  • JS作用域链

    JS的变量的作用域可分为全局变量和局部变量在JS函数内部可以直接读取全局变量,在函数内的局部变量外部是无法读取的,...

  • 闭包

    阮一峰的闭包js中函数具有内部无法访问外部函数变量的特性(与函数的作用域有关系),因此当需要得到函数内部的局部变量...

  • 闭包

    JS变量的特殊性(1)函数内部可以直接读取全局变量,而外部无法读取函数内部。var n=100;function ...

  • javascript 闭包得理解与使用

    1.源于js的一条规则:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。 2.为了解决问题...

  • JS-回调函数、省份显示

    省份简称与省份全称 js,如何把省份简称转换成省份全称 callback回调函数 JS中回调函数(callback...

  • JQuery中$.getJSON回调函数中无法对外部变量进行赋值

    jquery中getJSON()的默认执行方式是异步的,也就是说当getJSON还没有执行完的情况下,该函数下面的...

网友评论

      本文标题:JS回调函数中无法改变外部变量的问题

      本文链接:https://www.haomeiwen.com/subject/nwynkxtx.html