理解闭包_javascript执行环境

执行环境

执行环境可以理解为一个栈,而全局变量——一切Js在其中发生,可以理解为栈底或者是一个装载其他子执行环境的容器。

函数执行是会在其自己的执行环境中执行,递归调用中,每一次递归调用都会有新的执行环境。当调用完成后,函数会返回原始的执行环境。

 

调用函数式,函数的执行环境的创建过程:

 

1. 在函数的执行环境中,创造一个活动对象(没有预定义原型的对象,且不可直接引用)

2. 创建一个arguments对象,这个对象类似数组,拥有length,callee等属性。arguments以整数下标的形式保存实际传入函数的参数。length对应实际传入参数的个数。

3. 为活动对象创建arguments属性,指向创建好的arguments对象

4. 为执行环境分配作用域,每个函数内部的[[scope]]属性由对象列表(链)组成,这个[[scope]]会被指定给一个函数调用执行环境,作为其作用域,同时把活动对象被添加到执行环境[[scope]]的前端

5. “可变对象”(这时的可变对象就是活动对象)完成“对象实例化”创建可变命名参数,依照函数定义的形式参数。接收实际参数,没有获得实际参数的可变命名参数被置为undefined

6. 对于内部声明的函数,在执行环境中创建新的函数对象,然后创建函数名属性(指针)指向新创建的内部函数对象。并将在函数内部声明的所有局部变量创建为可变对象的命名属性。根据声明的局部变量创建的可变对象的属性在变量实例化过程中会被赋予 undefined 值。在执行函数体内的代码、并计算相应的赋值表达式之前不会对局部变量执行真正的实例化。事实上,拥有 arguments 属性的活动对象和拥有与函数局部变量对应的命名属性的可变对象是同一个对象。因此,可以将标识符 arguments 作为函数的局部变量来看待。

7. 为this关键字赋值

 

  如果this指向一个对象的引用(比如对象的方法),则this就是引用该对象的属性。

var ref = {               boy : "CaoLixiang",               girl : "HuJin",               love : function()  {                   return this.boy + /* this为ref对象的引用 */ " and " +                           this.girl + " love each other.";               }            };   alert(ref.love());  

  

 

 

   执行后O(∩_∩)O~
  

  如果赋值为null,则this指向全局变量(Js设计时的一个bug)   

 Js代码  
  1. var a = "HuJin"// a是全局变量  
  2.         var test = function() {  
  3.             alert(this.a); // 这个this会被赋予null  
  4.         }  
  5. test();   

 

    执行后O(∩_∩)O~
  
   

写在最后的:

下面这张图描述了1-7的步骤,必要时温习帮助自己理解

 

  

 

 

 Js代码  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值