zoukankan      html  css  js  c++  java
  • 两段代码说明 闭包,变量提升 问题

    1.闭包:

            var cat = {
                name:'Kitty',
                eat:function(){
                    console.log(this.name + ' eat food')
                },
                closure:function(){
                    //1.
                    // (function(){
                    //     console.log(this === window)
                    // })()
    
                    //2.2
                    func()
                }
            }
    
            //2.1
            function func(){
                console.log(this === window)
            }
    
            cat.eat()
            cat.closure()

    1. 和 2.2 的效果是完全一样的  因为匿名函数 并不是cat 对象的成员,等价于在全局作用域定义.

    解决办法:用es6 箭头函数 也可以用var _this = this 将this 传递给闭包

                    (()=>{
                        console.log(this === cat)//true
                        console.log(this === window)//false
                    })()
    
                    
            
                 var func = ()=>{
                     console.log(this === window)//true
                  }

      

    说明:箭头函数中this的作用域是离他最近的区域的this作用域.func 最外面还是window.而里面的匿名箭头函数

    是closure函数中this的作用域,因为它是cat 对象的成员所以,this 指的就是cat.

    2.变量提升

         //不会报错 undefined
            console.log(i)
            for(var i = 0;i < 10;i++)
            {
                console.log(i)
            }
            //值是10 9 < 10 进入循环,i又加了一次
            console.log("last:" + i)
    
            //相当于
            //变量被提升到了作用域的最前面 这个过程是js 代码预检查期间做的
            var a;
            console.log(a)
            for(a = 0;a < 10;a++)
            {
                console.log(a)
            }
            console.log("last:" + a)

    对于这种情况 es6 中的let 替换var 可以解决此问题.还有就是没有用var let const 申明的变量默认是全局变量

  • 相关阅读:
    罗马数字
    逆序对
    等价串
    郊区春游
    贝壳找房函数最值
    Educational Codeforces Round 45 Editorial
    Codeforces Round #486 (Div. 3)
    checkbox保存和赋值
    oninput和onchange的区别
    cookie路径概念理解
  • 原文地址:https://www.cnblogs.com/xuezizhenchengxuyuan/p/6814020.html
Copyright © 2011-2022 走看看