码迷,mamicode.com
首页 > 编程语言 > 详细

javaScript函数与闭包

时间:2015-07-30 10:48:27      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

 

js中函数也是对象,具有一切对象的特征,可以作为表达式给变量赋值,可以作为函数的形参,或者函数的返回值,函数内可以嵌套函数等等。函数内部使用var定义的局部变量只能在函数内部进行访问,在函数调用完成后被释放,从这点,可以模拟私有变量,块状作用域等。

1.javaScript函数定义

js中函数定义有两种方法:函数声明和函数表达式,函数声明可以进行函数声明提升,函数表达式则不会。

2.闭包

闭包是指有权访问另一个函数作用域中的变量的函数,和匿名函数是不同的概念。只不过其常见的创建方式,就是在一个函数内部创建另外一个函数。

对于一个闭包来说,其作用域链按照搜索顺序包括:闭包的活动对象——>闭包所在函数的活动对象——>全局活动对象。作用链上所有的活动对象,都能够在闭包内访问到。

关于闭包,需要注意以下几点:

1)闭包只能包含外部函数中任何变量的最后一个值,如下所示: 

function createFunctions(){
    var result=new Array();
    for(var i=0;i<10;i++){
        result[i]=function(){
            return i;
        }
    }
    return result;
}

var result=createFunctions();
alert(result[0]());

此时的返回值是10,而非想要的0.可以通过创建另一个匿名函数让闭包的行为符合预期。

function createFunctions(){
    var result=new Array();
    for(var i=0;i<10;i++){
        result[i]=(function(num){
            return function(){
                return num;
            }
        })(i);
    }
    return result;
}

var result=createFunctions();
alert(result[0]());

经过上述重写后,函数能够返回各自不同的索引值。此时,没有把闭包直接赋值给数组,而是定义了一个匿名函数,并将该匿名函数调用的结果幅值给数组。

2)匿名函数的执行环境具有全局性,因此this对象通常指向window。每个函数在调用时候都会自动取得两个特殊变量:this和arguments;因为变量的搜索从闭包内部的活动对象开始,因此永远不可能直接访问到外部函数中的这两个变量,如果需要访问,需要将外部作用域中的this/arguments保存在一个闭包能够访问的变量中。

3)利用闭包可以模拟块状作用域

 

javaScript函数与闭包

标签:

原文地址:http://www.cnblogs.com/bobodeboke/p/4688277.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!