本文实例讲述了JavaScript解析机制与闭包原理。分享给大家供大家参考,具体如下:
js解析机制:
js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ }
在扫描js代码时会把:
1、用声明的方式创建的函数的名字;
2、用var定义的变量的名字存到这个词法环境中;
3、同名的时候:函数声明会覆盖变量,下面的函数声明会覆盖上面的同名函数;
4、函数的值为:对函数的一个引用; 变量的值为undefined;
5、如果用函数表达式的方式创建一个函数:
var fn = function(){ }
这样词法环境中存的是一个变量名fn,并赋值为undefined;
在调用函数的时候如果在函数上面调用就会出现和变量一样的情况报错undefined;
这也是以两种不同方式创建函数的区别;
LexicalEnvironment(这个词法环境===window){fn: 对函数的一个引用;b:undefined;}
用声明的方式创建的函数:
function fn(){ };
用var定义的变量:
var b=5;
每次调用函数的时候就会创建一个新的词法环境对象(仓库):LexicalEnvironment{ };
在解析函数内部的变量和函数声明的时候跟全局词法环境相同,不过有两点需要注意,如下:
LexicalEnvironment(这个词法环境===fn){a:对函数的一个引用;(解析的时候函数声明把变量覆盖了,尽管变量已经被赋值为1)b:2;(解析的时候把变量存在了词法环境里,同时赋值为2)}
function fn (a,b){ alert(a)// function a(){ } alert(b)//2 var b= 100; function a(){ }}fn(1,2);
调用函数并传递参数的时候,词法环境里会再存变量名的同时赋值,如果是函数内部有同名的函数声明则会把传入的参数覆盖;如果形参只有一个,那么另一个实参则被赋值为undefined;
闭包:
定义:(有多种定义)
1、(比较通俗的定义):函数嵌套函数,内部函数可以引用外部函数的参数和变量,这些参数和变量不会被垃圾回收机制所回收;
2、在计算机科学中,闭包是词法闭包的简称,是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外(意思就是不会被销毁)。
3、闭包是由函数和其相关的引用环境组合而成的实体。(潜台词就是这个函数将和引用环境同时存在,必须有引用)
综合来说,不管怎么定义都是在围绕着两个本质:函数在引用变量,这个变量将不会被销毁。
什么叫做被引用的自由变量离开了创造它的环境?如下:
新闻热点
疑难解答
图片精选