Javascript高级程序设计——this、闭包、函数表达式

      在javascript中函数声明会被提升,而函数表达式不会被提升。当函数执行时,会创建一个执行环境和相应的作用域链,然后利用arguments和其他的命名参数的值来初始化函数的活动对象,作用域链链中所有的外部活动对象都处于第二的位置。

  

function compare(num1, num2){
    if(num1 < num2){
        retunr -1;   
    }
    else if(num1 = num2){
        retunr 0;   
    }
    else(num1 > num2){
        retunr 1;   
    }
}


var result = compare(5, 10);

1、调用compare函数时,先创建了一个包含this、arguments、num1、num2的活动对象,然后全局作用域包含this、result、compare在作用域链的第二的位置。

2、每个执行环境都有一个表示变量的对象变量对象。全局环境的变量对象始终存在,而compare函数的局部环境的变量对象,只在执行过程存在。

3、在创建compare时,会创建一个预先包含全局变量对象的作用域链保存在scope属性中。调用compare时会创建一个执行环境,然后通过复制函数的scope的属性中的对象来      构建起执行环境的作用域链,然后又有一个活动对象被创建并,推入执行环境的作用域前端。

4、函数执行完其局部活动对象就销毁了,除非包含闭包。

 

如果在一个函数内部声明另一个内部的函数,那么内部的函数有权访问包围函数的活动对象,内部函数就是闭包。

在一个函数内部定义的函数会将包含的活动对象添加到作用域链中,在外部函数执行完后,其执行环境的作用域链会被销毁,但活动对象仍然会留在内存,直到内部

的匿名函数被销毁。

闭包保存引用整个外部函数的活动对象,

function ass(){
    var element = document.getElementById("id");
    elelment.onclick = function(){
        alert(element.id);
    }
}

创建一个element事件处理的闭包,内部引用了外部整个活动对象,所以这里会有循环引用,取消循环引用

function ass(){
    var element = document.getElementById("id");
    var id = element.id;            //复制属性值,消除循环引用
    elelment.onclick = function(){
        alert(id);
    }
    element = null;             //取消引用,释放内存
}

注意:匿名函数的执行环境具有全局性,this.通常指向全局作用域window。

var name = "window"

var obj = {
    this.name : "in object";
    getName:function(){
        return :function(){
            return this.name;
        }
    }
}

alert(obj.getName()());
输出window,匿名函数执行环境具有全局性。

 

posted @ 2015-09-04 23:16  xnuwu  阅读(182)  评论(0编辑  收藏  举报