为什么回调中定义的变量可以在我的代码中的其他位置访问?

时间:2016-05-30 02:51:33

标签: javascript node.js mongodb express

以下是我所拥有的功能性快递应用程序,它连接到我在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的入门教程。我没有神奇地写上面的代码!

2 个答案:

答案 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");
  });
});