让变量作用域

GTS*_*Joe 2 javascript variables let

以下代码将输出“1”。但是,关键字“let”不应该使 xa 成为全局变量,从而使其对 das() 不可见吗?let 应该将变量的范围限制为仅声明它们的块,但在这里,我看到一个内部函数可以访问“let”变量,即使 x 是在其范围之外声明的。这怎么可能?

function letTest() {
	function das () {
		console.log(x);
// How does this function have access to a let variable declared outside its scope?
	}

	let x = 1;
	das();
}
letTest();
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 5

这是一种思考如何let工作的方式:

  1. let.
  2. 在相同的嵌套级别,通过源代码备份/向上,找到第一个{.
  3. 现在从let找到相应的}.

这为您提供了变量可见的范围。如果函数定义出现在该范围内,那很好;该变量对该函数中的代码可见。

现在,什么是有点不可思议的是,在你的榜样变量看起来像它在示波器的使用之前它的声明。这就是引用出现在声明之前这一事实变得更有趣的地方。

通常,如果作用域中的代码在实际发生let之前引用了一个-declared 变量let,那就是一个错误。但是,这是运行时的事情,而不是语法的事情。在您的情况下,在运行时let将在调用嵌套函数时“发生”。

  • 所以“让”限制了外部范围,而不是内部范围? (2认同)