JavaScript变量

一、变量声明

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() 不是一个函数。

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容