设为首页 加入收藏

TOP

作用域和闭包的通俗理解(四)
2018-03-18 16:21:17 】 浏览:512
Tags:作用 包的 通俗 理解
nbsp; doOtherthing2: doOtherthing
    }
}


上方代码中,外界可以通过doSomething1和doOtherthing2来操作里面的数据,但不让外界看到。


(2)index.html:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>05_闭包的应用_自定义JS模块</title>
</head>
<body>
<!--闭包的应用 : 定义JS模块  * 具有特定功能的js文件  * 将所有的数据和功能都封装在一个函数内部(私有的)  * 【重要】只向外暴露一个包含n个方法的对象或函数  * 模块的使用者, 只需要通过模块暴露的对象调用方法来实现对应的功能-->
<script type="text/java script" src="myModule.js"></script>
<script type="text/java script">var module =myModule();module.doSomething1();module.doOtherthing2();</script>
</body>
</html>


同样是实现方式一种的功能,这里我们采取另外一种方式。


(1)myModule2.js:(是一个立即执行的匿名函数)


(function () {
    //私有数据
    var msg = 'Smyhvae Haha'


    //操作私有数据的函数
    functiondoSomething() {
        console.log('doSomething() ' + msg.toUpperCase())
    }


    functiondoOtherthing() {
        console.log('doOtherthing() ' + msg.toLowerCase())
    }


    //外部函数是即使运行的匿名函数,我们可以把两个方法直接传给window对象
    window.myModule = {
        doSomething1: doSomething,
        doOtherthing2: doOtherthing
    }
})()


(2)index.html:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>05_闭包的应用_自定义JS模块2</title>
</head>
<body>
<!--闭包的应用2 : 定义JS模块  * 具有特定功能的js文件  * 将所有的数据和功能都封装在一个函数内部(私有的)  * 只向外暴露一个包信n个方法的对象或函数  * 模块的使用者, 只需要通过模块暴露的对象调用方法来实现对应的功能-->


<!--引入myModule文件-->
<script type="text/java script" src="myModule2.js"></script>
<script type="text/java script">myModule.doSomething1()
    myModule.doOtherthing2()
</script>
</body>
</html>


上方两个文件中,我们在myModule2.js里直接把两个方法直接传递给window对象了。于是,在index.html中引入这个js文件后,会立即执行里面的匿名函数。在index.html中把myModule直接拿来用即可。


总结:


当然,方式一和方式二对比后,我们更建议采用方式二,因为很方便。


但无论如何,两种方式都采用了闭包。


缺点:函数执行完后, 函数内的局部变量没有释放,占用内存时间会变长,容易造成内存泄露。


解决:能不用闭包就不用,及时释放。比如:


    f = null;  // 让内部函数成为垃圾对象 -->回收闭包


总而言之,你需要它,就是优点;你不需要它,就成了缺点。


内存泄漏:占用的内存没有及时释放。内存泄露积累多了就容易导致内存溢出。


常见的内存泄露:


情况1举例:


    // 意外的全局变量
    functionfn() {
        a = new Array(10000000);
        console.log(a);
    }


    fn();


情况2举例:


    // 没有及时清理的计时器或回调函数
    var intervalId = setInterval(function () { //启动循环定时器后不清理
        console.log('----')
    }, 1000)


    // clearInterval(intervalId);  //清理定时器


情况3举例:


<script type="text/java script">functionfn1() {var arr =new Array[100000];//这个数组占用了很大的内存空间functionfn2() {console.log(arr.length)
    }return fn2
  }var f =fn1()
  f()


  f =null//让内部函数成为垃圾对象-->回收闭包</script>


内存溢出:当程序运行需要的内存超过了剩余的内存时,就出抛出内存溢出的错误。


  //内存溢出
  var obj = {}
  for (var i = 0; i < 10000; i++) {
    obj[i] = new Array(10000000);  //把所有的数组内容都放到obj里保存,导致obj占用了很

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android基础知识:Activity中获取.. 下一篇Kotlin/Native应用程序开发指南

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目