什么是立即执行函数
function(){}.call() // 立即执行函数
如何使用立即执行函数
- 我们不想要全局变量
- 我们要使用局部变量
- ES 5 里面,只有函数有局部变量
- 于是我们声明一个 function xxx,然后 xxx.call()
- 这个时候 xxx 是全局变量(全局函数)
- 所以我们不能给这个函数名字
- function(){}.call()
- 但是 Chrome 报错,语法错误
- 试出来一种方法可以不报错:
- !function(){}.call() (我们不在乎这个匿名函数的返回值,所以加个 ! 取反没关系)
- (function(){}).call() 不推荐
xxx
(function(){}).call() 报错 - frank192837192463981273912873098127912378.call() 不推荐
- 用 window 就变成全局变量
!function(){
var person = window.person = {
name: 'frank'
}
}.call()
!function(){
var person = window.person
console.log(person)
}.call()
什么是闭包
函数访问了函数外面的变量,这个函数和变量就是闭包。
如何使用闭包
- 立即执行函数使得 person 无法被外部访问
- 闭包使得匿名函数可以操作 person
- window.frankGrowUp 保存了匿名函数的地址
- 任何地方都可以使用 window.frankGrowUp
综上4点得: 任何地方都可以使用 window.frankGrowUp 操作 person,但是不能直接访问 person
!function(){
var person = {
name: 'frank',
age: 18
}
window.frankGrowUp = function(){ // 闭包
person.age += 1
return person.age
}
}.call() // 立即执行函数用来隔离作用域,person变成局部作用域
!function(){
var newAge = window.frankGrowUp() // 不加() 就等于函数体,不执行
console.log(newAge)
}.call() // 19
var accessor = function(){
var person = {
name: 'frank',
age: 18
}
return function(){ // 闭包
person.age += 1
return person.age
}
}
var growUp = accessor.call()
console.log(growUp.call()) // 19