Javascript I';我对费用变量绑定有些困惑

Javascript I';我对费用变量绑定有些困惑,javascript,scope,Javascript,Scope,我已经阅读了一些JS中关于范围的指南,但我不太明白这里发生了什么 这确实有效: 然而,这使得Firebug说“x未定义” 那么为什么funcB中的自由x变量没有绑定到funcA第一行中声明为10的x 谢谢您不能这样做,因为var声明了一个局部变量,仅在声明该变量的函数范围内可见 funcB主体中的任何内容都看不到funcA主体中的内容,您必须明确(传递参数),或在funcA内部声明funcB以结束x(闭包) 因此,您可以做的是使funcB将x作为参数: var funcB = function(

我已经阅读了一些JS中关于范围的指南,但我不太明白这里发生了什么

这确实有效:

然而,这使得Firebug说“x未定义”

那么为什么funcB中的自由x变量没有绑定到funcA第一行中声明为10的x


谢谢

您不能这样做,因为
var
声明了一个局部变量,仅在声明该变量的函数范围内可见

funcB
主体中的任何内容都看不到
funcA
主体中的内容,您必须明确(传递参数),或在
funcA
内部声明
funcB
以结束
x
(闭包)

因此,您可以做的是使
funcB
x
作为参数:

var funcB = function(x) {
  alert(x);
};

function funcA(fn) {
  var x = 10;
  fn(x);
}

funcA(funcB);

JavaScript中的每个函数都有自己的
词法环境
:它内部使用的标识符(名称)和特定变量(和函数)之间的映射,这些变量(和函数)要么存在(在外部范围内),要么将在该函数的范围内创建

关键的一点是,给定函数的词法环境是在定义该函数时创建的,而不是在执行该函数时创建的

在第二个示例中,
funcB
中提到的name
x
没有任何可映射的对象-在其自身范围或父(外部)范围中没有名为
x
的变量。与第一个示例不同,在第一个示例中,
b
可以映射到名为
b
的局部变量,该变量位于相同的作用域函数
a


当然,
funcB
不能(也不应该)知道其他函数的词法环境,因为它不能(也不应该)知道是否从这些函数中调用它。

var
声明了一个局部变量。请参阅,但对匿名的调用是否在声明x的范围内,即在funcA中?我知道我可以对函数使用参数——这只是一个实验。让我感到不舒服的是,我不知道自由变量是在函数的创建过程中绑定的,而不是在函数的执行过程中绑定的。@user3391564:JavaScript有词汇作用域,而不是动态作用域。“定义时创建,而不是执行时创建”。这就解释了。谢谢
var funcB = function(){
    alert(x);
}

function funcA(anonymous){
    var x = 10;
    anonymous();
}

funcA(funcB);
var funcB = function(x) {
  alert(x);
};

function funcA(fn) {
  var x = 10;
  fn(x);
}

funcA(funcB);