Js函数声明和函数表达式
区别:1.使用上没有任何区别
2.但对预解析有影响
3.函数声明是函数,函数表达式是变量
4.以function开头的都是函数声明,其他都是函数表达式
5.一旦函数声明变成了函数表达式,就会放弃函数名(只能看,没有任何作用),函数表达式一般都是没有函数名的。
6.()是函数执行符号
7.不能直接去执行函数声明
8.可以去执行函数表达式
函数的预解析的四部:
1.在函数执行前的一瞬间,会产生一个AO对象(active object).
2.分析函数,有形参则将形参作为AO对象的属性名,对应的实参则为AO对象的属性值。
3.寻找分析Var声明,变量名作为AO对象的属性名,值为undefined,遇到同同名,不做任何改变
4.分析函数声明,函数命为AO对象的属性名,值为函数体,遇到同名的直接覆盖
1.全局作用域产生的对象为GO对象(global object),在进入script后,在所有代码之前产生。
产生的方式和AO对象基本相同,只是少了分析参数这一环节
2.寻找分析Var声明,变量名作为GO对象的属性名,值为undefined,
遇到同同名,不做任何改变
3.分析函数声明,函数命为GO对象的属性名,值为函数体,遇到同名的直接覆盖
7. // 内部的原理,浏览器底层代码,我们可根据实际情况进行模拟
8. // 1.test.AO = {
9.
10. // }
11. // 2.test.AO = {
12. // a : 1
13. // b : undefined
14. // }
15. // 3.test.AO = {
16. // a : 1
17. // b : undefined
18. // }
19. // 4.test.AO = {
20. // a : function a(){};
21. // b : undefined
22. // }
23. // 此时,已经预解析过程分析完毕,开始逐行执行代码,沿着test.AO对象开始执行代码
24. // 活动对象后期肯定会发生改变的。预解析过程分析过的就不用管,没分析执行(var后面的赋值部分)
25.
26. console.log(a); //function a(){};
27. console.log(b); //undefined
28. var b = 234;
29. // test.AO = {
30. // a : function a(){};
31. // b : 234
32. // }
33. console.log(b); //234
34. a = 123;
35. // test.AO = {
36. // a : 123
37. // b : 234
38. // }
39. console.log(a); //123
40. function a(){};
41. var a;
42. b = 456;
43. // test.AO = {
44. // a : 123
45. // b : 456
46. // }
47. var b = function(){}
48. // test.AO = {
49. // a : 123
50. // b : function(){}
51. // }
52. console.log(a); //123
53. console.log(b); //function(){}
54. }
js函数声明和函数表达式及预解析
最新推荐文章于 2022-10-09 17:28:12 发布