转自:https://www.jianshu.com/p/c1c0907d64f8
在es6之前,js只具有函数作用域(缺少块作用域),并通过闭包的内部的引用传递值。但是在es6之后,出现了let和const,实现了块作用域。
函数套函数的方式可以创造出一个局部变量,这种方式就叫做闭包。
比如:
function foo(){
var local = 1
function bar(){
local++
return local
}
return bar
}
var func = foo()
func()
local和bar函数组成了一个闭包,外部不能直接获取local的值,但是通过bar函数可以得到。
在实际应用中,比如在开发一款游戏,全局定义了主人公有几条命,如果不希望别人不小心更改了这个值,就可以把它放在一个立即执行的闭包里,有需要的时候调用闭包里的函数就可以了。
main.js
!function(){
var lives = 50
window.addLife = function(){ // 加一条命
lives += 1
console.log('现在有几条life1--',lives)
},
window.decLife = function(){ // 减一条命
lives -= 1
console.log('现在有几条life2--',lives)
}
window.getLife = function(){ // 获取目前有多少条命
return lives
}
console.log('现在有几条life--',lives)
}()
helloWord.vue:
<template>
<div class="hello">
<p>显示全局的Life:{{lifes}}</p>
<button @click="addLife">加一条life</button>
<button @click="decLife">减一条life</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
lifes:0
}
},
mounted(){
this.lifes = window.getLife()
},
method:{
addLife(){
window.addLife()
this.lifes = window.getLife()
},
decLife(){
window.decLife()
this.lifes = window.getLife()
},
}
}
</script>
这样就能通过调用函数的方式访问和更改一个局部的生命值,从而避免产生全局变量,影响整体环境,增加代码的兼容性。
由于匿名函数无法像普通函数一样随意调用,可以将它转换为立即执行函数,以下为立即执行函数的几种写法:
!fuction(){}()
~fuction(){}()
+fuction(){}()
-fuction(){}()
void fuction(){}()
(fuction(){}())
(fuction(){})()
更多精彩内容:各种AI课程、技能课程、黑科技软件、网站小程序源码、副业小项目、PPT模板等精品素材、电商课程、推广引流课程等,尽在 天边资源网 。