<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script>
//有不少开发人员总是搞不清楚匿名函数和闭包这两个概念,因此经常混用
//闭包是指有权访问另一个函数作用域中的变量的函数。
//创建闭包的常见方式,就是在一个函数内部创建另一个函数
function fun(value){
return function(obj1,obj2){
var num1 = obj1[value];
var num2 = obj2[value];
if(num1>num2){
return 1;
}else if(num1<num2){
return -1;
}else{
return 0;
}
}
}
var fun1 = fun('哈哈');//创建函数
console.log(fun1);//输出一个匿名函数
var msg = fun1({'哈哈':2},{'哈哈':1});//调用函数
console.log(msg);//输出1
fun1 = null;//解除对匿名函数的引用,以便释放内存
//闭包与变量
/*作用域链的配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数
中任何变量的最后一个值。别忘记了闭包所保存的是整个变量对象,而不是某
个特殊的变量。
*/
function createFun(){
var arr = new Array();
for(var i=0;i<10;i++){
arr[i] = function(){
return i;
};
}
return arr;
}
var fun1 = createFun();
console.log(fun1);//输出一个函数数组
for(var i=0;i<fun1.length;i++){
console.log(fun1[i]());//输出10次10
}
/*
* 表面上看,似乎每个函数都应该返回自己的索引值,即位置0的函数返回0
位置1的函数返回1,以此类推。但实际上,每个函数都会返回10。因为每个
函数的作用域链中都保存着creatFun()函数的活动对象,所以它们引用的都是
同一个变量i。当creatFun()函数返回后,变量i的值是10,此时每个函数都引用
着保存变量i的同一个变量对象,所以在每个函数内部i的值都是10。
*/
//下面,我们通过创建另一个匿名函数强制让闭包的行为符合预期
function creatFun2(){
var arr = new Array();
for(var i=0;i<10;i++){
arr[i] = function(num){
return function(){
return num;
};
}(i);
}
return arr;
}
var fun2 = creatFun2();
console.log(fun2);//输出一个函数数组
console.log(fun2[5]());//输出5
for(var i=0;i<fun2.length;i++){
console.log(fun2[i]());//输出0-9
}
</script>
</html>
JavaScript-闭包
最新推荐文章于 2022-05-19 15:47:49 发布