JS的解析与执行——全局预处理命名冲突解决策略与执行

在预处理阶段,如果函数声明有冲突,会覆盖。如果变量声明有冲突,会忽略。例如:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>全局预处理命名冲突解决策略与执行</title>
</head>
<body>


<script>


foo();


console.log(a);


function foo(){


   console.log("foo1");


}


function foo(){


   console.log("foo2");


}


var foo = 5566;


var a =5;


var a =7;


console.log(a);


</script>


</body>
</html>



预处理阶段与执行阶段词法环境对比,代码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>全局预处理与执行阶段对比</title>
</head>
<body>


<script>


console.log(a);
console.log(foo);
console.log(g);


var a = 5;


function foo(){


  console.log("foo.log");
}


var g=function(){


  console.log("g.log");
}


console.log(a);
console.log(foo);
console.log(g);


</script>


</body>
</html>


预处理阶段:
Lexical Environment{

    a:undefined

    foo:对函数的一个引用

    g:undefined

}


执行阶段:

Lexical Environment{

    a:5

    foo:对函数的一个引用

    g:对函数的一个引用

}






猜你喜欢

转载自blog.csdn.net/mypc2010/article/details/78793169