一、执行上下文

变量声明提升:通过var定义的变量,在定义之前就可以访问到。 值:undefined
函数声明提升:通过function声明的函数,在之前就可以直接调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var a = 3;
function fn(){
//var a;
console.log(a);
//a = 4;
var a = 4;
}
fn() //输出undefined

console.log(b) //undefined 变量提升
var b = 3;

fn(); //undefined 函数提升
function fn(){
console.log('fn()');
}

二、闭包

如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套外部(父)函数的变量(函数)时,就产生了闭包。

1
2
3
4
5
6
function fn1(){
var a = 2;
function fn2(){
console.log(a);
}
}

闭包到底是什么?
理解一:闭包是嵌套的内部函数
理解二:包含被引用变量(函数)的对象
产生闭包的条件?
函数嵌套
内部函数引用了外部函数的数值(变量/函数)
常见的闭包
将函数作为另一个函数的返回值
将函数作为实参传递给另一个函数调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
将函数作为另一个函数的返回值
function fn1(){
var a = 2;
function fn2(){
a++;
console.log(a)
}
return fn2;
}
var f = fn1()
f() //3
f() //4

将函数作为实参传递给另一个函数调用
function showDelay(msg, time){
setTimeout(function(){
alert(msg);
}, time)
}
showDelay('wefr', 2000)

闭包的作用
使用函数内部的变量在函数执行完成之后,仍然存活在内存中(延长了局部变量的生命周期)
让函数外部可以操作(读写)到函数内部的数据(变量/函数)

三、进程和线程

进程:程序的一次执行,它占有一片独立的内存空间。可以通过windows任务管理器查看进程。
线程:是进程的一个独立执行单位,是程序执行的一个完整流程。一个进程中至少有一个运行的线程,他是主线程,由进程启动后自动创建。