JavaScript: 理解作用域链
JavaScript: understanding scope chain
以下代码片段中的作用域链是什么 -
var name = 'John';
function foo() {
if (false) {
var name = 'James';
}
console.log(name);
}
foo();
我有几个关于这个的问题 -
- 为什么函数
foo
中的记录器正在打印 undefined
即使变量
在全球范围内可用吗?是不是因为同一个变量
在条件错误块中重新声明,因此全局变量是
从范围中删除?
- 此外,如果我们将函数
foo
内 if 语句下的变量声明从 var
替换为 let
,则函数 foo
内的记录器会从全局范围打印名称.这是如何工作的?
如果你用var
重新声明变量,它在整个函数中都有作用域。如果您使用 let
而不是 var
,它将仅在 if
范围内可用。
var name = 'John';
function foo() {
if (false) {
let name = 'James';
}
console.log(name);
}
foo();
是的,这是因为用 var
声明的变量具有函数作用域,并且它们被提升到 function
的顶部。由于提升,它记录 undefined
。
用 let
声明的变量具有块作用域,因此在不执行 if
块之前,不会声明变量 name
。
即使您用 if(true)
更改它也不会起作用,因为该变量只能在块内使用。 {}
不在外面。
这是 let
工作原理的示例。
if(true){
let x = 3
}
console.log(x);
以下代码片段中的作用域链是什么 -
var name = 'John';
function foo() {
if (false) {
var name = 'James';
}
console.log(name);
}
foo();
我有几个关于这个的问题 -
- 为什么函数
foo
中的记录器正在打印undefined
即使变量 在全球范围内可用吗?是不是因为同一个变量 在条件错误块中重新声明,因此全局变量是 从范围中删除? - 此外,如果我们将函数
foo
内 if 语句下的变量声明从var
替换为let
,则函数foo
内的记录器会从全局范围打印名称.这是如何工作的?
如果你用var
重新声明变量,它在整个函数中都有作用域。如果您使用 let
而不是 var
,它将仅在 if
范围内可用。
var name = 'John';
function foo() {
if (false) {
let name = 'James';
}
console.log(name);
}
foo();
是的,这是因为用 var
声明的变量具有函数作用域,并且它们被提升到 function
的顶部。由于提升,它记录 undefined
。
用 let
声明的变量具有块作用域,因此在不执行 if
块之前,不会声明变量 name
。
即使您用 if(true)
更改它也不会起作用,因为该变量只能在块内使用。 {}
不在外面。
这是 let
工作原理的示例。
if(true){
let x = 3
}
console.log(x);