Fork me on GitHub

js


js 运行三部曲

语法分析

预编译

1
2
3
4
5
6
解释性语言
函数声明整体提升
变量 声明提升
如果变量未经声明就赋值,变量就为全局对象所有。
一切声明的全局变量,全是 window 的属性。
window 就是全局
1
2
3
4
5
6
预编译发生在函数执行前一刻
函数预编译
1.创建AO对象
2.找形参和变量声明,将便变量和形参名作为 AO 属性名,值为 undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
1
2
3
4
全局预编译
1.创建GO对象
2.找变量声明,将便变量作为 GO 属性名
3.在函数体里面找函数声明,值赋予函数体

解释执行

作用域

1
函数每次执行时对应的执行上下文都是独一味二的,多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁

闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。

闭包作用
1. 实现公有变量
eg :函数累加器
function add(){
var count=0
function demo(){
count ++ ;
console.log(count)
}
return demo
}
var counter=add();
counter();
counter();

2.可以做缓存

3.实现封装,属性私有化

4.模块化开发,防止污染全局变量



function a(){
var num =100
function b(){
num++
console.log(num)
}
return b
}

var demo=a()
demo()
demo()

立即执行函数

1
2
3
4
5
6
7
8
9
10
11
12
针对初始化功能的函数
(function (){
var a=123;
var b=234;
console.log(a+b)
}())


var num =(function(a,b,c){
var d=a+b+c
return d
}(1,2,3))

请我喝杯可乐吧