<!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>立即执行函数</title>
</head>
<script>
//普通js,map调用
let run1 = {
speed:0,
start:function(){this.speed = 60},
getSpeed:function(){return this.speed}
}
run1.start()
console.log(run1.speed); //60 可直接访问成员变量
run1.speed = 90
console.log(run1.getSpeed());//90 //成员函数。发现被修改了,有时侯这是很危险的事情。特别是多人合作的项目:公有对象的成员变量值被修改了
//闭包
function run() {
let speed = 0;
return {
start() {
speed = 10
},
getSpeed() {
return speed
}
}
}
let runNow = run()
runNow.start();
console.log(runNow.speed); //undefined。不可以直接访问成员变量,当然也不能被修改。私有化
console.log(runNow.getSpeed());
//立即执行函数。也是将变量和函数私有化,外界不可以直接访问。
let runGo = (function () {
let startSpeed = 0;
return {
start() {
startSpeed = 30
},
getSpeed(){
return startSpeed
}
}
})()
//立即执行函数返回的是一个对象。拥有两个成员函数:start和getSpeed
runGo.start();
console.log(runGo.getSpeed());
//立即执行函数也就是将 闭包 写成匿名然后执行。匿名函数---不能多次调用,只能调用一次---声明时立即执行 ---》立即执行函数产生
</script>
<body>
</body>
</html>
闭包使用注意:
注意的是因为把带有内部变量引用的函数带出了函数外部,所以该作用域内的变量在函数执行完毕后的并不一定会被销毁,直到内部变量的引用被全部解除。所以闭包的应用很容易造成内存无法释放的情况。
立即执行函数可优化内存:
当UI渲染完成之后,代码对data
的引用也就随之解除,而在最外层函数执行完毕时,JavaScript引擎就开始对其中的对象进行检查,data
也就可以随之被回收。
哈哈哈,是不是发现立即执行函数 可以优化闭包的缺陷 (某些时候)