猫鼬回调中的变量作用域是否不同?

时间:2019-05-24 07:51:24

标签: javascript node.js mongoose

我的变量cart似乎在回调块内声明。

如果我声明一个新变量(例如newCart)而不是重新分配它,它将起作用。

cartRouter.post('/', (req,res) => {
    var username = req.body.username;
    var cart = req.body.cart;

    User.find({ username }, (err, res_find) => {
        if(err) throw err;
        var user_id = res_find[0]._id;
        var cart = new Cart({ cart, user: user_id })

        cart.save((err_save, cart_save) => {
            if (err_save) {
                res.json({ "resultType": "failure", "resultMessage": err });
            } else {
                res.json({ "resultType": "success", "resultMessage": "Cart successfully saved." });
            }
        })
    })
}

var cart = new Cart({ cart, user: user_id })行中,如果我声明一个新变量var newCart,然后将其与newCart.save()而不是cart.save()一起使用,则可以,但是我不确定为什么。

1 个答案:

答案 0 :(得分:1)

写作时

var cart = new Cart({cart, user: user_id});

变量cart的范围是回调函数。即使在变量的初始化表达式中,它也会尝试使用局部变量,而不是包含函数中的局部变量。但是由于变量尚未初始化,因此值为undefined。从本质上讲,它等同于编写:

var cart;
cart = new Cart({cart, user:user_id});

因此,如果要同时引用外部变量,则需要使用其他变量名。

如果您尝试使用let而非var,则实际上会出现错误

  

初始化前无法访问购物车

(至少在Chrome中,我不知道ES6是否需要这样做)。