在预处理阶段,如果函数声明有冲突,会覆盖。如果变量声明有冲突,会忽略。例如:
<!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:对函数的一个引用
}