javascript - 猫鼬回调中的变量范围不同吗?
问题描述
我的变量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()
它可以工作,但我不知道为什么。
解决方案
当你写
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).
推荐阅读
- java - 当分隔线在 ComponentListener 内移动时,JSplitPane 阻止 PropertyChangeEvent
- java - LinkedList 删除:为什么我们不用以前的覆盖头部?
- nginx - 链接到同一域上的非 gatsby html 页面,而 Gatsby 不会重定向到 404
- react-native - 启动启动画面时隐藏缺口灰色背景
- node.js - 在没有控制器的情况下使用 NestJS 生成 openApi DTO
- r - 如何通过R中的变量引用数据框中的列
- python-3.x - 更改弹出 Kivy 的颜色
- tensorflow - Colab 的 TensorFlow 2 在运行时重启后变回 TensorFlow 1
- symfony4 - 服务“security.authentication.provider.guard.main”依赖于不存在的服务“App\Security\LoginFormAuthenticator”
- string - 比较元组列表中的第二个元素