1
function fn() {
a = 0
return function(b) {
return b +a++
}
}
var f = fn()
console.log(f(5))
console.log(fn()(5))
console.log(f(5))
console.log(a)
var test = (function(i) {
return function() {
alert( i *= 2)
}
})(2)
test(5)
var test = (function(i) {
/**
* 先把自执行函数执行,再把自执行函数执行的返回结果赋值给test
* test => 自执行函数返回的小函数
* EC(AN)
* 作用域链:<EC(AN),EC(G)>
* 形参赋值: i = 2
* 变量提升:====
* 不释放的闭包
*
*/
return function() {
/**
* test(5)执行
* EC(TEST)
* 作用域链:<EC(TEST),EC(AN)>
* 变量提升:====
* 形参赋值:===
*/
alert( i *= 2) // i是上级上下文的变量:2 . i = i*2 = '4'(alert(弹出的都是string类型))
}
})(2)
test(5)
var b = 10;
(function b() {
var b = 20;
console.log(b); //=>20
})();
console.log(b); //=>10
/**
* 匿名函数具名化(设置了名字):
* 1.设置的名字只能在函数内部使用,外部是无法使用的(基于这种方式代替严格模式下不兼容的arguments。callee,
* 并以此实现递归算法[自己调用自己])
* 2.在函数内部去修改这个名字,默认是不能修改的,代表的依然是函数本身(
* 除非这个函数名字在函数体内被重新声明过,重新声明后,一切都按照重新声明的为主)
*/
(function fn() {
console.log(fn) // 函数本身
fn = 10
console.log(fn) // 不会被修改,还是函数本身
/**
* 重新声明后,存在变量提升
* 变量提升: var fn
*/
console.log(fn) // undefined
var fn = 20 // 重新声明
console.log(fn) // 20
})()
console.log(fn) //Uncaught ReferenceError: fn is not defined(外部不能使用)