美文网首页
JavaScript变量

JavaScript变量

作者: threetowns | 来源:发表于2018-01-16 11:47 被阅读0次

    一、变量声明

    JavaScript有三种声明:

    • var 声明一个变量
    • let 声明一个块作用域的局部变量(block scope local variable)
    • const 声明一个只读的常量。

    1. 变量求值

    • varlet 声明的且未赋初值的变量,值会被设定为 undefined
    • 试图访问一个未声明的变量或者访问一个使用 let 声明的但未初始化的变量会导致一个 ReferenceError 异常被抛出。
    var a;
    console.log('The value of a is ' + a); // The value of a is undefined
    
    console.log('The value of b is ' + b); // The value of b is undefined
    var b;
    
    console.log('The value of c is ' + c); // Uncaught ReferenceError: c is not defined
    
    let x;
    console.log('The value of x is ' + x); // The value of x is undefined
    
    console.log('The value of y is ' + y); // Uncaught ReferenceError: y is not defined
    let y;
    
    • 数值类型环境中 undefined 值会被转换为 NaN。
    var a;
    a + 2;  // Evaluates to NaN
    
    • 当你对一个 null 变量求值时,空值 null 在数值类型环境中会被当作 0 来对待
    var n = null;
    console.log(n * 32); // Will log 0 to the console
    

    2. 变量的作用域

    • 在所有函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问。
    • 在函数内部声明的变量,叫做局部变量,因为它只能在该函数内部访问。
    • 语句块作用域
      ECMAScript 6 之前的JavaScript没有 语句块作用域;相反,语句块中声明的变量将成为语句块所在代码段的局部变量。例如,如下的代码将在控制台输出 5,因为 x 的作用域是声明了 x 的那个函数(或全局范围),而不是 if 语句块。
    if (true) {
      var x = 5;
    }
    console.log(x);  // x is 5
    

    如果使用 ECMAScript 6 中的 let 声明,上述行为将发生变化。

    if (true) {
      let y = 5;
    }
    console.log(y);  // ReferenceError: y is not defined
    

    3. 变量声明提升

    变量声明提升(variable hoisting),JavaScript 变量的另一特别之处是,你可以引用稍后声明的变量而不会引发异常,然而提升后的变量将返回 undefined 值。
    1).

    console.log(x === undefined); // true
    var x = 3;
    

    等价于

    var x;
    console.log(x === undefined); // true
    x = 3;
    

    2).

    // will return a value of undefined
    var myvar = 'my value';
     
    (function() {
      console.log(myvar); // undefined
      var myvar = 'local value';
    })();
    

    等价于

    // will return a value of undefined
    var myvar = 'my value';
     
    (function() {
      var myvar;
      console.log(myvar); // undefined
      myvar = 'local value';
    })();
    
    • 在 ECMAScript 2015 中,letconst)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出错误 ReferenceError
    console.log(x); // ReferenceError
    let x = 3;
    

    二、函数提升

    对于函数,只有函数声明会被提升到顶部,而不包括函数表达式(表达式定义的函数,称为匿名函数,匿名函数没有函数提升)。

    • 函数声明
    foo(); // "bar"
    
    function foo() {
      console.log('bar');
    }
    
    • 函数表达式
    baz(); // TypeError: baz is not a function
    
    var baz = function() {
      console.log('bar2');
    };
    

    【注】:此时的 baz 相当于一个声明的变量,类型为 undefined 。由于 baz 只是相当于一个变量,因此浏览器认为 baz() 不是一个函数。

    参考

    相关文章

      网友评论

          本文标题:JavaScript变量

          本文链接:https://www.haomeiwen.com/subject/nihsoxtx.html