JavaScript变量
2018-01-16 本文已影响0人
threetowns
一、变量声明
JavaScript有三种声明:
- var 声明一个变量
- let 声明一个块作用域的局部变量(block scope local variable)
- const 声明一个只读的常量。
1. 变量求值
- 用
var
或let
声明的且未赋初值的变量,值会被设定为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 中,
let
(const
)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出错误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()
不是一个函数。