两段代码说明 闭包,变量提升 问题

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 申明的变量默认是全局变量

 

posted @ 2017-05-05 17:18  JonasYu  阅读(228)  评论(0编辑  收藏  举报