javascript - 闭包的案例疑问?
怪我咯
怪我咯 2017-04-11 12:08:18
[JavaScript讨论组]
    function process(data){
         alert(data);
     }
     var someReallyBigData=function(){
         //dosomeing
     }
     process(someReallyBigData);

     var btn=document.getElementById("my_button");
     btn.addEventListener("click",function click(evt){
        alert("button click");
     },false);
     
《你不知道的javascript》说是,由于click函数形成了一个覆盖整个作用域的闭包,javascript 
 引擎极有可能依然保存着这个结构(取决于具体实现);
 
 有两疑问:
   1、click函数形成了一个覆盖整个作用域的闭包??该如何理解?
   2、取决于具体实现。又该如何理解?
   烦诸位大神解惑!
   
   
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
ringa_lee

不是什么大神,说说自己的理解,仅供参考:
先说一下实现: 就是不同的浏览器对某些相同的功能实现的方式可能不同,这个就是实现。


我把书中的代码改装一下,改装理由:如果在全局中执行代码,声明的函数和变量都在全局作用域中,所以是一直存在的,当网页关闭时才会销毁,也就不存在闭包等,所以书中的代码应该是在某一个函数中,我就用一个IIFE代替。

(function(){
  function process(data){
      alert(data);
  }
  var someReallyBigData=function(){
      //dosomeing
  }
  process(someReallyBigData);

  var btn=document.getElementById("my_button");
  btn.addEventListener("click",function click(evt){
     alert("button click");
  },false);
})()

因为点击事触发click函数可能会调用外层函数作用域中的变量,所以形成了闭包,所以导致可能不会回收。

巴扎黑
function click(evt){
    alert("")
    //console.log('全局中的某一变量')
}

1.首先上述函数处在全局作用域中。
2.内部可能会引用全局中的变量(虽然例子里没引)。
按照上下文可以这么理解,只是说的不太清楚。
而且你也可以看到下文中,作者将全局中的一个变量放在了块作用域中,这样这个全局的click函数就访问不到了(块作用域被支持的情况下)。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号