来看一段代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>ECMAScript确认变量的值的流程</title>
</head>
<body>
<script>
var num=10;
function fn(num){
var num=8;
return num;
}
alert(fn(5)+num);
</script>
</body>
</html>
每一句ECMAScript代码都运行在一个包围这些语句的‘容器’中。例如函数体中的语句就被函数包围着,而直接写在<script>标签中的语句也被一个全局容器包围着,当然这个全局容器在页面中只有一个,跟<script>标签的个数无关。ECMAScript把这样的‘容器’称为代码的执行环境。
那么ECMAScript如何确定变量的值?
(1)确定调用变量这条语句所在的执行环境E
(2)在E中查找指定名称(变量声明时的名称)的变量值
(3)如果未查到,并且E已经是全局执行环境,返回undefined,否则扩大查找范围为包含E的执行环境,将这个新的执行环境称为E,并转到第二步
(4)如果查到变量值,返回给调用语句
对于函数而言,特殊的地方在于,如果形式参数与函数体内声明的变量同名,那么会优先使用声明的变量,而不是参数,但它们之间没有执行环境的包含关系,这主要是arguments对象的原因。通过这个规则,预判运行开头的代码将会弹出18
运行结果图: