js函数写法
函数声明
1 | fn(111); |
函数表达式
1 | fn(111); |
匿名函数
1 | function (){ |
闭包
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
1 | function fn1() { |
这样就清晰地展示了闭包:
fn2的词法作用域能访问fn1的作用域
将fn2当做一个值返回
fn1执行后,将fn2的引用赋值给fn3
执行fn3,输出了变量name
经典代码
1 | for (var i = 1; i <= 10; i++) { |
目标
1 | for (var i = 1; i <= 10; i++) { |
闭包的应用
闭包的应用比较典型是定义模块,我们将操作函数暴露给外部,而细节隐藏在模块内部:
1 | function module() { |
在for循环中运行setTimeout的三种情况
1 | for(var i=0;i<10;i++){ |
1 | for(var i=0;i<10;i++){ |
1 | for(var i=0;i<10;i++){ |
异步执行的运行机制如下:
- 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
- 主线程之外,还存在一个”任务队列”(task queue)。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。
- 一旦”执行栈”中的所有同步任务执行完毕,系统就会读取”任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
- 主线程不断重复上面的第三步。
- 主线程从”任务队列”中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取”任务队列”,这就是JavaScript的运行机制。这个过程会循环反复。
一般来说,有以下四种会放入异步任务队列:
- setTimeout和setlnterval
- DOM事件
- ES6中的Promise
- Ajax异步请求
JavaScript的垃圾回收机制
在js中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第三者引用,那么这两个互相引用的对象也会被回收。