Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的作用域链是什么?_Javascript - Fatal编程技术网

JavaScript中的作用域链是什么?

JavaScript中的作用域链是什么?,javascript,Javascript,当我使用以下代码时: 它给我的输出是1。 但当我使用以下代码时: 输出为2。当我使用以下代码时: 我再一次得到输出为2。我知道这和我在谷歌搜索的范围链有关,但我并没有完全理解 作用域链只是声明标识符的位置,搜索这些位置以解析标识符的值 区分在何处声明和何时声明是很重要的。仅仅因为在使用q的函数调用之前声明q并不意味着将使用q——可以有多个q变量,每个变量都有自己的作用域 在我们看示例之前,先想象一下这个场景。你在一个大房间里,分为足够两个工人的小隔间。你和你的同事“乔”共用一个隔间(因为你在那里

当我使用以下代码时:

它给我的输出是1。 但当我使用以下代码时:

输出为2。当我使用以下代码时:

我再一次得到输出为2。我知道这和我在谷歌搜索的范围链有关,但我并没有完全理解


作用域链只是声明标识符的位置,搜索这些位置以解析标识符的值

区分在何处声明和何时声明是很重要的。仅仅因为在使用
q
的函数调用之前声明
q
并不意味着将使用
q
——可以有多个
q
变量,每个变量都有自己的作用域

在我们看示例之前,先想象一下这个场景。你在一个大房间里,分为足够两个工人的小隔间。你和你的同事“乔”共用一个隔间(因为你在那里,那是你的本地范围,你和乔共用)。如果你和乔同时坐在同一个隔间里,你想和乔说话,你只需说“嗨,乔”,乔就会立即做出反应。但是,如果乔站起来到办公室的饮水机去取水呢?如果你说“嘿,乔”,他不会出现在你的小隔间范围内,因此你必须将搜索范围扩大到整个办公室(更高的范围包含你的隔间所在的范围)。但是,通过将搜索范围扩大到下一个更高的范围(沿着范围链向上),您最终会找到Joe。现在想象一下,水冷却器在同一楼层的两个办公室之间共享。你不会在你的隔间里找到乔,他也不会在你的办公室里,所以你必须再次扩大搜索范围,包括你可以看到的其他范围(隔壁的办公室)

还和我在一起吗?现在,这里有一条皱纹。。。如果每个地点都有不同的“Joe's”,而你想找的Joe在另一个办公室呢?当你说“嗨,乔!”时,最接近的人会回答,但那可能不是你心目中的乔。这就是您的
q
变量所发生的情况。您在不同的作用域级别声明了多个,并且您期望的不是最接近您从中调用它的作用域

函数a(){
//q在这个范围内声明,这是它所在的下一个最高的范围
//用于console.log,因此1是输出
var q=1;
函数b(){
//q不在此函数的作用域中声明,因此下一个更高的作用域
//需要检查。
控制台日志(q);
}
b();
}
//即使此代码在函数调用之前运行,
//这是在最高范围内创建不同的“q”变量
//--全球范围。当函数运行时,它不需要
//要一直搜索到此级别以查找声明
//对于q,2不是输出的值
var q=2;
//现在,运行函数

a()在编写代码部分的问题时,请使用代码标记,以便于阅读代码。您将每个示例过于简化,因为它们都不会产生任何输出,因为它们中的任何一个都没有调用
b()
。请创建一个实际复制您的问题的版本。我现在已经更正了
function a(){
  var q = 1;
  function b(){
    console.log(q);
  }
 b();
}

var q= 2;
a();
function b(){
  console.log(q);
}

function a(){
  var q = 1;
 b();
}

q= 2;
a();
function a(){
  function b(){ 
    console.log(q);
  }
b();
}

var q= 2;
a();