JS函数参数外部环境

时间:2017-01-11 18:19:01

标签: javascript function environment

我对JS的外部环境有疑问。假设我有这样的代码:

function callbackTest(callback) {
  var a = 1;
  callback();
}
callbackTest(function() {
  console.log(a);
});

布鲁尔告诉我,a没有定义。这意味着外部环境是全局上下文,但我在callbackTest中创建了函数,因此我假设回调的外部环境是callbackTest。有人可以告诉我为什么吗? THX!

3 个答案:

答案 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 函数时活动的任何范围。