node.js在定义之前使用函数

时间:2019-12-22 19:38:30

标签: node.js

我想问一个关于node.js文件中代码顺序的问题。

我从Udemy课程中获得了以下有关使用passport.js进行用户身份验证的代码。

// CREATE - add new campgrounds to DB
router.post("/", isLoggedIn, function(req, res) {
    // get data from form and add to campgrounds array
    var name = req.body.name;
    var image = req.body.image;
    var desc = req.body.description;
    var author = {
        id: req.user._id,
        username: req.user.username
    }
    var newCampground = {name: name, image: image, description: desc, author:author}
    // Create a new campground and save to database
    Campground.create(newCampground, function(err, newlyCreated) {
        if(err) {
            console.log(err);
        }
        else {
            console.log(newlyCreated)
            res.redirect("/campgrounds")
        }
    })
    // redirect as a GET request
})

function isLoggedIn(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    res.redirect("/login");
}

我在这里有点困惑。我在上面的路由之后定义了函数isLoggedIn,并使用中间件确定是否应在该行中执行以下代码

router.post("/", isLoggedIn, function(req, res) {

这与我学习的其他语言(包括HTML和Python)的原则背道而驰,其中必须在使用之前明确定义所使用的任何代码,包括电子表格和变量。

即使在我的isLoggedIn POST路由之后声明了函数router.post,为什么代码仍能起作用?

2 个答案:

答案 0 :(得分:1)

JavaScript中悬挂了函数声明,因此它们被移至其作用域的顶部,这就是为什么您可以毫无问题地使用它们的原因。

您可以在此处阅读有关吊装的更多信息: https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

答案 1 :(得分:1)

这是由于javascript中的“吊装”所致。

“提升是一种JavaScript机制,其中变量和函数声明在代码执行之前移至其作用域的顶部。这不可避免地意味着,无论在何处声明函数和变量,都将其移至其作用域的顶部。他们的范围是全球范围还是本地范围。”

https://scotch.io/tutorials/understanding-hoisting-in-javascript

相关问题