这有两个方面:
当代码中的变量声明在它下面时,为什么可以通过回调来router.post
访问变量?myFunc
为什么回调传递给router.post
访问分配给myFunc
变量的函数,当它没有分配给变量时,直到它在代码中的下方?
首先我们将处理变量,然后我们将处理它的值(我们分配给它的函数):
myFunc 变量是在使用后声明的,所以这不应该抛出错误吗?
要是var
不吊起来就好了。而是var
被吊起来了。因此,当您的模块被加载时, JavaScript 引擎首先会查看它以查找所有变量声明和函数声明,处理它们,然后在您的模块中执行分步代码。
例如,对于 JavaScript 引擎,您的模块实际上如下所示:
var router = undefined;
var myFunc = undefined;
router = express.Router();
.
.
.
router.post('/', function(req, res) {
var myVar = undefined;
...
...
myVar = myFunc(); // WORKS!
...
...
}
myFunc = function() {
...
}
更多关于这个在我贫血的小博客上:可怜的误解var
为什么节点 js 中函数表达式的位置不重要?
确实如此。您没有遇到麻烦的唯一原因是在调用您传入的回调myFunc
之前不使用它,这是在您的模块脚本的顶级范围代码运行之后(包括表达式创建)。router.post
myFunc
例如,会发生什么:
准备工作(创建变量router
并将myFunc
它们设置为undefined
)
调用,它express.Router
为router
调用router.post
,传入但不调用回调函数
创建函数,该函数为myFunc
稍后,当请求进入时,回调被调用,此时时间myFunc
已经创建(并且可以访问,因为回调myFunc
是声明的上下文的闭包)
这与此类似:
setTimeout(function() {
var myVar = myFunc();
}, 0);
var myFunc = function() {
// code here...
}
首先setTimeout
调用,然后创建函数并将其分配给myFunc
,然后调用回调函数并通过 调用该函数myFunc
。