如何覆盖javascript变量?

时间:2014-02-05 05:55:55

标签: javascript variables express global-variables local-variables

我正在开发一个Express.io迷你项目,我仍然坚持这个变量覆盖问题。

这是我的代码:

get_time_offset = function(timezone_id){
   Timezone.findById(timezone_id, function(err, doc){
        if(err) {
            console.log(err);
        } else {
            console.log(doc.offset);
        }
   });
}

此代码块可以通过console.log显示doc.offset的值,没有任何问题,我想让doc.offset在Timezone Object之外可用。这是我到目前为止所得到的:

get_time_offset = function(timezone_id){
    var offset;
    Timezone.findById(timezone_id, function(err, doc){
       if(err) {
            console.log(err);
       } else {
          offset = doc.offset;
       }
    });
    console.log(offset);
}

它说“偏移是未定义的”,我似乎找不到任何其他解决方法。

3 个答案:

答案 0 :(得分:3)

我在考虑将你的初始声明改为......

var offset = {};

...或者,您的console.log正在函数完成之前执行。通过在函数中添加日志进行简单检查......

    } else {
      offset = doc.offset;
      console.log('from inside ... ', offset);
    }
   });
  }
console.log('from outside ... ', offset);

...看看'outside'是否会先开火。

编辑:

如果首先运行'from outside',请使用初始函数调用您的后续代码。

get_time_offset = function(timezone_id){
  var offset;

  function processResult(val) {
    console.log(val);
  }

  Timezone.findById(timezone_id, function(err, doc){
    if(err) {
      console.log(err);
    } else {
      offset = doc.offset;
    }
    processResult(offset);
  });
}

答案 1 :(得分:2)

如果你想在函数内部提供偏移量,可以将它作为参数传递给demo http://thomasdavis.github.io/tutorial/anonymous-functions.html

var scope = {offset : 10};
get_time_offset = function(timezone_id){
    Timezone.findById(timezone_id, function(err, doc, scope){
        if(err) {
            console.log(err);
        } else {
            scope.offset = doc.offset;
        }
    });
}
console.log(scope.offset);

抱歉编辑:我在示例中犯了一个错误,偏移必须是一个对象,它通过引用传递并修改,这是一个小提琴我一起攻击它http://jsfiddle.net/VLbVw/4/

答案 2 :(得分:0)

试试这个:

get_time_offset = function(timezone_id, callback){

    Timezone.findById(timezone_id, function(err, doc){
       if(err) {
            console.log(err);
    callback(false);
       } else {
         callback(doc.offset);
       }
    });

};

get_time_offset(5, function(offset){
   console.log(offset)
});