javascript基础(十)使用var与不使用var定义变量的区别

学习了变量的作用域和执行上下文后我们看一个例子,并顺便说一下使用var定义变量和不使用时的区别。var定义变量时,会把这个变量限定于这个作用域下,只有在其内部能使用,对外不可见;this定义变量时,内部使用需要加this,因为this根据调用不同,对外表现也不同;什么都不加的时候,准确地说是赋值了,而不是定义变量了,就要沿着作用域链去寻找了,找到谁算谁,到了全局都没找到,只好给全局的属性里加一个这个了。
参考:https://www.jb51.net/article/35542.htm

    var height = 100
    function a() {
        var age = 21
        var height = 128
        var weight = 70
        function b() {
            console.log(age)    //25
            console.log(height)  //128
            var age = 25
            console.log(age)   //25
            height = 180
            console.log(height)  //180
            console.log(this.height)
        }
        b()
    }
    a()

1.首先全局上下文环境创建height被赋值为undefined,然后把a这个函数定义好,并赋值。
2.接下来从第10行开始执行代码,给全局上下文环境中的height赋值为100,第11行到第25行没有可执行代码,到了第26行开始调用a函数,a上下文环境被创建,把他环境中age,height,weight先赋值为undefined,给b函数赋值。
3.接下来从第12行开始执行a中的代码,给age赋值21,height,weight同理,第15行到第23行不需要执行。
4.到了第24行开始调用b函数,此时创建b执行上下文环境,先把age赋值为undefined,注意!这里是在他的作用域里把age赋值为undefined了,与a中的age无关,这就是var的作用,他限制了你定义变量的作用域为当前作用域。
5.接下来从16行开始执行代码,这时候输出age肯定是undefined喽,因为作用域链的关系,他会先去b作用域中找age,发现b创建执行上下文环境时有age,是undefined于是就输出了。
6.17行输出height,自己的作用域里没有,根据作用域链,b是从a这个作用域下定义的,去a中找height,有一个被赋值的128,输出。
7.18行给自己作用域的age赋值为25,下一行再输出就是25了。
8.遇到一个赋值语句,注意没有var,仅仅是一个赋值语句,所以在创建b的执行上下文环境时并没有在自己的作用域下创建一个height变量,这就要根据作用域链去找了,找到了a中有height,赋值为180,下一行输出也是找的a中的height输出。
9.22行,先要弄清楚this指的是谁,我们再分析一下b函数的执行,虽然是在函数a内部,但他是一个全局执行。

    var height = 100
    function a() {
        var age = 21
        var height = 128
        var weight = 70
        this.b = function() {
            console.log(age)    //25
            console.log(height)  //128
            var age = 25
            console.log(age)   //25
            height = 180
            console.log(height)  //180
            console.log(this.weight)  //undefined
        }
    }
    var aa = new a()
    aa.b()

猜你喜欢

转载自blog.csdn.net/C_Ronaldo_/article/details/81045121