是否可以使用外部变量从另一个函数调用函数?

时间:2012-07-21 02:37:38

标签: javascript node.js

我创建了一个创建会话ID的函数

sessionId = ot.create_session(location, function(sessionId){
    console.log('The session ID is: ' + sessionId + '++++++++');
    return sessionId;
});

我可以从函数中打印出会话ID,但不能从函数外部访问它。


如果失败了,我想调用一个函数,将变量传递给函数

sessionId = ot.create_session(location, function(sessionId){
    console.log('The session ID is: ' + sessionId + '++++++++');
    sendToUser(sessionId);
});

但是,我需要sendToUser来获取更多数据,这是一个先前声明的变量,名为 data

那么......我会做

sessionId = ot.create_session(location, function(sessionId){
    console.log('The session ID is: ' + sessionId + '++++++++');
    sendToUser(sessionId);
});

sendTo User(sessionId, data){
}

然而,这不起作用,

整个代码位于:http://pastebin.com/CdV3rdh0

1 个答案:

答案 0 :(得分:1)

以下代码段:

setTimeout(function() {
   console.log("I'm first! Am I?"); // #2
}, 0);

console.log("Hahah, I'm first!"); // #1

首先记录 “哈哈,我是第一个!”然后“我是第一个!我是吗?”到控制台。为什么呢?

javascript解释器在执行任何其他操作之前首先从上到下运行任何函数(比如在零秒后执行回调函数)。这是因为javascript中的函数通常是非阻塞的,IO是异步完成的。这意味着,setTimeout不会等到它作为第一个参数执行时获得的匿名函数,而只是注册函数回调以在零秒内执行。它在解释器到达文件末尾后立即执行。

因为ot.create_session需要将文件写入磁盘来创建会话,所以sessionId只能在回调函数内部使用,并且你永远不会从那里得到sessionId,因为当调用回调函数时,外部函数已经完成执行,整个上下文已经消失:)

为什么还需要来自回调函数外部的会话ID? data的第二个参数sendToUser似乎也可以在回调函数中使用。只需写下sendToUser(sessionId, data)