这一篇简单的说一说js的函数执行和js的执行上下文的概念,以前在个人博客里边也提到过
js的堆栈队列,
这一篇打算单独的拿出来讲一说html
一段能够执行的代码在被执行的时候,会建立一个函数的执行上下文
执行上下文里边有三个重要的属性分别是浏览器
执行上下文是跟函数相关的,执行上下文分为两个阶段函数
建立阶段
执行阶段
首先建立阶段this
扫描变量和函数(肯定变量环境)
肯定this指向
肯定词法环境
简单说一下词法环境和变量环境的区别,我我的理解的就是说词法环境是包含变量环境的spa
在js里边原型链你们都不陌生 ,js在当前的对象里边找不到所使用的属性的话会去他的上一级去找
直到Object,再找不到就会undefined ,这里边 当前对象的做用域就是他的变量环境,而词法环境则是与之关联的的执行上下文中声明的变量指针
在建立阶段 函数的声明会被储存在当前的变量环境之中,var的变量的话则会被设置成undefined
,因此咱们在声明以前就能够访问到var声明的变量 ,but他是一个undfinedcode
而后就是执行阶段了htm
这个时候已经完成了对全部变量的分配,开始执行代码对象
什么是变量对象,变量对象就是与执行上下文相关得数据得一个做用域,这里边存储了在这个上下文里边定义的而变量和函数声明blog
函数声明的时候会在建立阶段的时候声明一个函数指针
故名思与函数上下文,在函数被执行的时候建立,那么全局上下文是何时被建立的呢,首先咱们要知道一个概念就是,全局对象
console.log(this);
能够尝试着去打印一下this,以下图能够看到,window对象里边有不少咱们经常使用或者常见的属性和方法
固然也有一些其余的状况this并非指向的window对象,this指向 这个东西,咱们会在下边说
用 instanceof 输出一下this 会发现也是一个object
console.log(this instanceof Object);
因此说全局对象是一个object的实例化对象
因此说说白了全局上下文就是在一开始就被建立的,全局上下文是由在浏览器关闭或者刷新的时候才会销毁, 而后这个window对象其实就是全局上下文的变量对象
函数上下文和上边所说的意思差很少,可是,啊,可是,在函数上下文中的时候,函数里边的变量对象是活动对象,他的英文名字叫作 actiation object ,大面上看的意思就是说只有进入了这个执行上下文中的时候,也就是说执行到了这个函数的时候,其中的变量对象才会被激活,才会能被访问,在没有执行到这个函数的时候,其属性是不能访问的,这里是和全局上下文不一样的。
function foo(a) { var b = 2; function c() {} var d = function() {}; b = 3; } foo(1);
首先看这段代码,上边也说了,函数执行有两个阶段建立阶段和执行阶段
首先进如执行上下文,进入建立阶段
上边这段代码在建立阶段是这样得
{ arguments: { 0: 1, length: 1 }, a: 1, b: undefined, c: reference to function c(){}, d: undefined }
而后函数的而执行阶段,这个时候就该干吗干吗了,函数里边声明的变量,赋值等等的会在这里根据代码,修改变量的值
{ arguments: { 0: 1, length: 1 }, a: 1, b: 3, c: reference to function c(){}, d: reference to FunctionExpression "d" }
得出一个结论,函数的执行上下文里边在初始化的时候只包含一个arguments对象,其余的属性是没有值的,为了直观一点 ,举个例子
function foo() { console.log(a); a = 1; } foo(); function bar() { a = 1; console.log(a); } bar();
好比说这个在foo函数的上下文里边打印a, 可是foo 里边没有用var声明,下边的a就找不到因此会打印一个 a is not defined。
可是第二个的话会打印一个1,由于搭载因以前,全局对象里边已经有了a属性
最后就是,在上文提到
c: reference to function c(){}, d: reference to FunctionExpression "d"
在上下文建立的时候,变量是不会覆盖这种声明的,好比说
console.log(foo); function foo(){ console.log("foo"); } var foo = 1;
会打印这个函数,可是, 啊,可是,若是是这样
function foo(){ console.log("foo"); } var foo = 1; console.log(foo);
这样的话就变成了刚才所说的赋值了 ,会打印1
以上是我对js函数的执行与上下文的一些认识,刚从博客园搬过来,有不足的但愿指正