设置超时函数CallBack静态变量

时间:2015-01-06 05:38:09

标签: javascript node.js

使用以下代码时:

var x = 5;
setTimeout(function() {
    console.log(x);
}, 2500);
x = 10;

输出为10,我完全理解为什么。

但是,我希望在上面的示例中输出为5(或者更具体地说,在调用set timeout函数时x的值,而不是调用回调时的值。)

我建议的一个选项是调用函数并查找数据。

类似的东西:

var x = 5;
var value_of_x_at_some_time = function() {
    return old_value_of_x;
}

setTimeout(function() {
    console.log(value_of_x_at_some_time());
}, 2500);
old_value_of_x = x;
x = 10;

我理解这个想法,但这意味着我需要通过一个数组并计算出正确的值。这可能是正确的方式,但对我来说并不合适。

我正在编写一些软件来管理调度事件,(使用节点调度),例如,我可以有一个AngularJS前端来设置事件的特定时间/长度,以及它的一些其他信息。

我有可能在同一时间有2个事件,所以当我在该功能中查找时,我需要知道使用哪一个(假设我有两个&#34) ;警报",如果你愿意,设置,一个回调需要知道使用blah [x],并且需要知道如何使用blah [x + 1]。

我可以查看当前时间并找到已经过去的最近时间然后标记我是否将其设置为执行所需的任何操作可能工作,但我想知道是否有办法包装我用作(匿名?)函数的一部分的变量的当前状态。

基本上我在nodejs中编写DVR应用程序,我正在连接到Firebase来管理持久数据,而前端是AngularJS,所以我可以保持大部分应用程序断开连接,我正在尝试使用node-调度,所以当我以角度添加录制事件时,我可以看到firebase中的数据更改,安排事件,以及当回调触发开始录制相应的节目时,我担心的是我可以将两个节目设置为同时录制时间,我必须管理正确的记录,我有一个可能的想法是这样的数据结构:

var recording_event = {
    time: "1500",
    date: "01012015",
    length: "3600", //time in ms
    channel: "51",
    program: "1",
    scheduled: "true",
    recording: "false"
}
var blah[] = recording_events....

然后在被调用函数中搜索数组blah。

var lookup_value() {
    // loop through blah[] till you find the event closest to current time,
    // check if recording is true, if not
    // set the value of recording to true
    // else search for the next matching event
    // assume x is the index that matches correctly
    // finally return the event
    return blah[x];
}

setTimeout(function() {
    var temp = lookup_value();
    // set tuner to temp.channel
    // set tuner to temp.program
    // start recording for length of time temp.length
}, 2500);

然而,这似乎我正在做更多的工作然后我需要,在我看来我会期望只是将这些数据作为函数的一部分,所以基本上用以下代替上面的函数:

temp = x //"newly secheduled event"
setTimeout(function() {
    // set tuner to temp.channel (value at the time of the scheduling)
    // set tuner to temp.program (value at the time of the scheduling)
    // start recording for length of time temp.length (value at the time of the scheduling)
}, 2500);

在运行时或多或少动态。有没有办法做到这一点?

(我也不知道这是不是一个好标题,我可以接受建议)。

2 个答案:

答案 0 :(得分:4)

只是解决问题的上半部分:

var x = 5;
(function(currentX) {
    setTimeout(function () {
                    console.log(currentX);
            }, 2500);
})(x);
x = 10;

将显示5

编辑:Felix Kling所说的全部内容。请注意,虽然我们在不同级别创建一个函数,但最终结果是相同的 - 重要的一点是函数存在,引入一个新的作用域,其中一个新变量与原始x断开连接。 / p>

EDIT2 :伙计们,即使我最初以10秒的优势击败了他,也要向菲利克斯做出更多的回答,他现在肯定是两个答案中更好的,不公平他只有我的upvote:D

答案 1 :(得分:3)

我没有详细阅读所有内容,但我想你想要创建一个新范围来捕获变量的当前值。函数创建范围,创建和调用函数的简便方法是使用IIFE

var x = 5;
setTimeout((function(y) {
  // this function is executed immediately and passed the current value of `x` 

  return function () {
   // this is function that is passed to setTimeout
   // since every function is a closure, it has access to the IIFE parameter y

   console.log(y);
  };
}(x)), 2500);
x = 10;

另请参阅:JavaScript closure inside loops – simple practical example

但是,有一个更简单的选项:您可以使用.bind 绑定特定值转换为函数的参数:

setTimeout(function(y) {
    console.log(y);
}.bind(null, x), 2500);

.bind创建一个新函数,并将this和参数设置为您传递给它的特定值。