以下是我所拥有的功能性快递应用程序,它连接到我在mlab上托管的数据库。但是,我很困惑我的代码中其他地方可以访问MongoClient.connect回调中定义的“db”变量。在连接函数中是否有一些我没有看到的魔法?请参阅以下评论:
const express = require('express');
const bodyParser = require('body-parser');
const MongoClient = require('mongodb').MongoClient
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
MongoClient.connect('link-to-my-db', (err, database) => {
if (err) return console.log(err);
db = database;
app.listen(3000, () => {
console.log("Listening on 3000");
});
});
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
app.post('/quotes', (req, res) => {
// How is it possible for "db" to be accessible here even though it was defined in a separate function?
db.collection('quotes').save(req.body, (err, result) => {
if (err) return console.log(err);
console.log('saved to database');
res.redirect('/');
})
});
仅供参考:我正在关注Node的入门教程。我没有神奇地写上面的代码!
答案 0 :(得分:4)
引用http://www.w3schools.com/js/js_scope.asp:
如果为尚未声明的变量赋值,它将自动成为GLOBAL变量。
这意味着,由于db
变量前面没有var
关键字,因此它被隐式声明为全局变量,并且可以从应用的其余部分访问。
答案 1 :(得分:0)
当你不使用var / let / const声明时,会发生这种情况:
var db; // declaration from below hoisted to global scope
MongoClient.connect('link-to-my-db', (err, database) => {
if (err) return console.log(err);
db = database; // the hoisted declaration, is set here
app.listen(3000, () => {
console.log("Listening on 3000");
});
});