JS中对函数解析与执行也是分为两个阶段,也是分为预处理阶段与执行阶段。函数的预处理阶段,每调用一次,产生一个Lexical Environment。与全局预处理不同的是,在函数中产生中的词法环境对象我们访问不了的。需要注意的一点是,函数的参数,在调用的时候已经加入到全局词法环境(Lexical Environment)对象中。函数预处理的内部声明式函数,内部var声明的变量以及解决冲突的策略与全局预处理相同。
代码如下:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>函数与处理与执行</title> </head> <body> <script> function foo(a,b) { console.log(a); console.log(b); var b =100; function a(){ console.log("function.a"); } } foo(5,6); </script> </body> </html>
预处理阶段
Lexical Environment{
a:执行函数的引用 //a:5,冲突,被覆盖
b:6 //var b=100,冲突,被忽略
arguments:2
}
在执行阶段会给预处理阶段的成员赋值。
扫描二维码关注公众号,回复:
1053118 查看本文章
在执行阶段,如果没有用var声明的变量,会成为最外部Lexical Environment的成员。
代码如下:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>函数与处理与执行</title> </head> <body> <script> function f1(){ function f2(){ bb="在执行阶段,如果没有用var声明的变量,会成为最外部Lexical Environment的成员"; }; f2(); } f1(); console.log(window.bb); </script> </body> </html>