<!DOCTYPE>
<html>
<head>
<title> New Document </title>
</head>
<body>
<script>
function foo(){var a=2;bar()};
function bar(){console.log(a)};
foo()
</script>
</body>
</html>
为什么会报错,原因是什么
<!DOCTYPE>
<html>
<head>
<title> New Document </title>
</head>
<body>
<script>
function foo(){var a=2;bar()};
function bar(){console.log(a)};
foo()
</script>
</body>
</html>
为什么会报错,原因是什么
js只有函数作用域,一个变量的作用域是在函数声明的时候确定,而不是在函数调用执行时。
函数作用域是一个静态的概念,在函数声明时会构建作用域链,函数执行时在这个作用域链中查找,一直到顶层全局作用域。
问题中提到a
变量只在foo
函数中定义,bar
函数执行的时候会在bar
函数的当前作用域中查找,找不到再到其外层函数(非执行它的函数,声明时的外层函数)的作用域中查找,一直到全局作用域,发现没有就会报ReferenceError
13 回答12.8k 阅读
7 回答1.9k 阅读
5 回答1.4k 阅读
3 回答2.6k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
5 回答1.2k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
Javascript 不止有函数(闭包)作用域,还有块级作用域
然而无论何种作用域,所声明的量的作用域都是由定义时所处的环境而非运行时所处的环境决定的。
这也就是说,一个函数能访问哪些量,在定义时就已经确定了。