Node.js函数外的变量范围

时间:2016-03-21 12:09:26

标签: node.js

我已经对node.js的异步属性以及回调的强大功能进行了大量阅读。

但是,我不明白我是否定义了一个函数并更改了该函数中变量的值,那么为什么它在函数外部不可用。

让我举一个例子来说明我一直在研究的代码。

var findRecords = function(db, callback) {

var cursor =db.collection('meta').find({"title":"The Incredible Hulk: Return of the Beast  [VHS]"}, {"asin":1,_id:0}).limit(1);
pass="";
cursor.each(function(err, doc) {
      assert.equal(err, null);
      if (doc != null) {
          var arr =  JSON.stringify(doc).split(':');
          key = arr[1];
          key = key.replace(/^"(.*)"}$/, '$1');
          pass =key;
          console.log(pass); //Gives correct output
      } 

   });

   console.log(pass)  //Does not give the correct output

};



MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);

  findRecords(db, function() {
      db.close();
  });
}); 

此处在函数内部打印pass值时,它会指定新值,但在函数外第二次打印时,它不会给出新值。

如何解决此问题。

3 个答案:

答案 0 :(得分:1)

let pass = 'test';

[1, 2, 3].map(function(value) {
  let pass = value;
  // local scope: 1, 2, 3
  console.log(pass);
}); 

console.log(pass); // => test

// ------------------------------

let pass = 'test';

[1, 2, 3].map(function(value) {
  pass = value;
  // local scope: 1, 2, 3
  console.log(pass);
}); 

// the last value from the iteration
console.log(pass); // => 3

// ------------------------------

// we omit the initial definition

[1, 2, 3].map(function(value) {
  // note the usage of var
  var pass = value;
  // local scope: 1, 2, 3
  console.log(pass);
}); 

// the variable will exist because `var`
console.log(pass); // => 3

// ------------------------------

// we omit the initial definition

[1, 2, 3].map(function(value) {
  // note the usage of var
  let pass = value;
  // local scope: 1, 2, 3
  console.log(pass);
}); 

// the variable will not exist because using let
console.log(pass); // => undefined

答案 1 :(得分:1)

尝试使用:

var pass="";
var that = this;
cursor.forEach(function(err, doc) {
      assert.equal(err, null);
      if (doc != null) {
          var arr =  JSON.stringify(doc).split(':');
          key = arr[1];
          key = key.replace(/^"(.*)"}$/, '$1');
          pass =key;
          console.log(pass); //Gives correct output
      } 

   }, that);
console.log(pass);

答案 2 :(得分:0)

而不是传递=“”
首先声明它并尝试这个var pass =“”;