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)利用闭包可以模拟块状作用域
时间: 2024-10-09 23:05:04