zoukankan      html  css  js  c++  java
  • javascript 变量声明 和 作用域

    变量的声明

      1.变量声明具有提升机制,Javascript在执行时,会把所有的声明都提升到当前作用域前面。

      先看一下下面的例子:

    (function(){
      alert(b)//b is not defined
      alert(a); //undefined
      var a = 200;
    })()

      运行的结果分别是:b is not defined ; undefined

      分析: 变量a的声明被提前,所以最初代码相当于:

    (function(){
      var a;//声明变量a
      alert(b)//b is not defined
      alert(a); //undefined
      a = 200; //(定义并)初始化变量a
    })()

      b不用解释,因为找不到b,所以会报错。a是应为声明被提前了,所以可以找到a,但变量a并没有赋值,所以会输出undefined.

    作用域:(全局作用域、函数作用域、eval作用域、ES6块级作用域)

      1.  函数体内部,局部变量的优先级比同名的全局变量优先级高。

    var a = 100;
    (function(){
        alert(a)//undefined
        var a = 200;
        alert(a)//200
    })()

      运行上面的例子可以输出: undefined;200。

      分析:第一个alert为什么会是undefined呢?这里有变量的两个知识点:第一个是变量声明会提前,第二个就是局部变量的优先级比同名全局变量优先级高。上面的代码相当于:

    var a = 100;
    (function(){
        var a;
        alert(a)//undefined
        a = 200;
        alert(a)//200
    })()

    在函数作用域内,变量a的声明被提前了,函数外全局变量a被函数内变量a覆盖。所以会输出undefined;第二个输出200是因为a=200被赋值的原因。

      2. ECMA2015 没有块级作用域,只有函数作用域和全局作用域 (ECMA2016 引入块级作用域)

    var a = 100;
    if(true){
        alert(a);//100
        var a = 200;
        alert(a);//100
    }

       上面代码输出结果为:100,200。说明javascript是没有块级作用域的。javasctipt中唯一拥有作用域的结构的是函数function

    综上:下面的代码的输出结果就好理解了

    var a = 100;
    var b = 200;
    function test(){
        alert(a); //undefined
        alert(b); //200
        b = 300;
        alert(b); //300
        var a = 1;
        alert(a); //1
    }
    test();
  • 相关阅读:
    KVC之-setValue:forKey:方法实现原理与验证
    李洪强iOS开发之iOS社区收集
    跟着百度学PHP[15]-会话控制session的工作机制
    代码审计学习之文件操作漏洞
    中间人攻击——ARP欺骗的原理、实战及防御
    跟着百度学PHP[14]-PDO的预处理语句2
    跟着百度学PHP[14]-PDO的预处理语句1
    跟着百度学PHP[14]-PDO之Mysql的事务处理2
    跟着百度学PHP[14]-PDO之Mysql的事务处理1
    跟着百度学PHP[14]-PDO的错误处理模式&PDO执行SQL
  • 原文地址:https://www.cnblogs.com/yangkangkang/p/5651045.html
Copyright © 2011-2022 走看看