js闭包的理解_js闭包的定义和用途

js闭包的理解_js闭包的定义和用途闭包就是指有权访问另一个函数作用域中的变量的函数,就称作闭包 如何创建闭包,在一个函数中,新建另一个函数 为什么会形成闭包呢,这是因为函数作用域的原因导致的,一个函数在执行时,它会生成一个执行环境和它的活动对象(arguments和命名参数),一般情况,这个函数在执行完毕之后会被垃圾回收机制给销毁,

js闭包的理解_js闭包的定义和用途"

闭包就是指有权访问另一个函数作用域中的变量的函数,就称作闭包

如何创建闭包,在一个函数中,新建另一个函数

为什么会形成闭包呢,这是因为函数作用域的原因导致的,一个函数在执行时,它会生成一个执行环境和它的活动对象(arguments和命名参数),一般情况,这个函数在执行完毕之后会被垃圾回收机制给销毁,但是如果在这个函数中,还有一个函数并且这个函数使用了外层函数中的变量,这时,他的执行环境会被销毁,但是,活动对象则不会销毁,直到这个函数执行完毕,外层活动对象才会被销毁

作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。下面这个例子可以清晰地说明这个问题。

1 function createFunctions(){ 2 var result = new Array(); 3 for (var i=0; i < 10; i++){ 4 result[i] = function(){ 5 return i; 6  }; 7  } 8 return result; 9 }

这个函数返回一个函数数组,看上去它应该返回的都是各自的索引值,但是它所有函数返回的都是10,这是因为当函数获取 i 时,外层函数早已执行完毕,执行作用域已经销毁,但是i因为被内部函数使用,没有销毁,i的值也变成循环完之后的值,就是10,上面说过,内部函数调用的是外层函数的活动对象也就是变量,参数等,这时,i已经变成10,所以这时所有函数返回值都是10

再看下面这个例子

 

 1 function createFunctions(){  2 var result = new Array();  3 for (var i=0; i < 10; i++){  4 result[i] = function(num){  5  console.log(num)  6 return function(){  7 return num;  8  };  9  }(i); 10  } 11 return result; 12  } 13 createFunctions()

 

这个例子中对函数做出来一些改变,在内部函数外面,包了一层立即执行函数,并且把i当做参数传了进去,因为函数参数是按值传递的,所以就会将当前i的值复制给参数num,在立即执行函数执行完返回函数时,这个函数返回的num值就是当前变量i的值.

以上就是笔者对js闭包的理解,如有错误,请指正.

 

今天的文章js闭包的理解_js闭包的定义和用途分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/51014.html

(0)
编程小号编程小号
上一篇 2023-09-01
下一篇 2023-09-01

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注