我对JS的外部环境有疑问。假设我有这样的代码:
function callbackTest(callback) {
var a = 1;
callback();
}
callbackTest(function() {
console.log(a);
});
布鲁尔告诉我,a没有定义。这意味着外部环境是全局上下文,但我在callbackTest中创建了函数,因此我假设回调的外部环境是callbackTest。有人可以告诉我为什么吗? THX!
答案 0 :(得分:2)
但我在callbackTest
中创建了该函数
不,你没有。该功能在callbackTest
的外部创建。
callbackTest(function() {
console.log(a);
});
如果你把它分成两个陈述,也许更容易看出:
var f = function() {
console.log(a);
};
callbackTest(f);
该功能在全球范围内创建。 callbackTest
内只有名为。但由于JavaScript具有词法范围而非动态范围,因此无法访问a
。
答案 1 :(得分:1)
变量a
在函数callbackTest
的范围内定义。你调用函数的地方并不重要。范围仍限于该功能。即使是以下内容也是未定义的:
function callbackTest() {
var a = 1;
}
callbackTest();
console.log(a);
您必须在外部范围内定义变量a
,其中所有代码共享:
var a;
function callbackTest(callback) {
a = 1;
callback();
}
callbackTest(function() {
console.log(a); // Now outputs 1
});
答案 2 :(得分:0)
函数的范围(环境)未在您调用它的位置定义,它是在您创建它的位置定义的。当您调用 callbackTest 函数而不是在其正文中时,会定义回调函数。这就是为什么回调不知道里面的变量,它的范围是调用 callbackTest 函数时活动的任何范围。