17、闭包练习题

1,166 阅读1分钟

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(外部不能使用)