首页 > 解决方案 > 猫鼬回调中的变量范围不同吗?

问题描述

我的变量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()它可以工作,但我不知道为什么。

标签: javascriptnode.jsmongoose

解决方案


当你写

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

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

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

因此,如果您还想引用外部变量,则需要使用不同的变量名。

If you tried to use let instead of var you would actually get an error

Cannot access 'cart' before initialization

(at least in Chrome, I don't know if this is required by ES6).


推荐阅读