JavaScript学习笔记-声明

336 阅读4分钟

变量声明

var 声明一个变量,可选初始化一个值,在function中声明一个局部变量,function外声明一个全局变量

let 声明一个块作用域的局部变量,可选初始化一个值。

const 声明一个块作用域的只读常量。

使用关键词 var 。例如 var x = 42。这个语法可以用来声明局部变量和全局变量。
直接赋值。例如x = 42。使用这种形式赋值,会产生一个全局变量。在严格模式下会产生错误。因此你不应该使用这种方式来声明变量。
使用关键词 let 。例如 let y = 13。这个语法可以用来声明块作用域的局部变量。

变量求值

varlet 语句声明的变量,如果没有赋初始值,则其值为 undefined 。

如果访问一个未声明的变量会导致抛出一个引用错误ReferenceError异常。

undefined 在数值环境中值会被转换为NaN、在布尔环境中会被当做false,可以用x === undefined来判断变量是否被赋值。

如果一个变量值为null,空值 null 在数值类型环境中会被当作0来对待,而布尔类型环境中会被当作 false

变量的作用域

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

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

if (true) {
  let y = 5;
}
console.log(y); // ReferenceError: y 没有被声明

变量提升

JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。
console.log(x === undefined); //true
var x = 3;

上面的例子也可以写作

var x;
console.log(x);
x = 3;
由于存在变量提升,一个函数中所有的var语句应尽可能地放在接近函数顶部的地方。这个习惯将大大提升代码的清晰度。
在 ECMAScript 6 中,letconst)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出引用错误ReferenceError。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。
console.log(x); // ReferenceError
let x = 3;

函数提升

对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。

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

全局变量

全局变量是全局对象的属性。在网页中,(译注:缺省的)全局对象是 window ,所以你可以用形如 window.variable的语法来设置和访问全局变量。因此,你可以通过指定 window frame 的名字,在当前 window frame 访问另一个 window frame 中声明的变量。例如,在文档里声明一个叫 phoneNumber 的变量,那么你就可以在子框架里使用 parent.phoneNumber 的方式来引用它。

常量

你可以用关键字 const 创建一个只读的常量。常量标识符的命名规则和变量相同:必须以字母、下划线(_)或美元符号($)开头并可以包含有字母、数字或下划线。

const PI = 3.14;

常量不可以通过重新赋值改变其值,也不可以在代码运行时重新声明。它必须被初始化为某个值。

常量的作用域规则与 let 块级作用域变量相同。若省略const关键字,则该标识符将被视为变量。

在同一作用域中,不能使用与变量名或函数名相同的名字来命名常量。例如:

// 这会造成错误
function f() {};
const f = 5;

// 这也会造成错误
function f() {
  const g = 5;
  var g;
  //语句
}

然而,对象属性被赋值为常量是不受保护的,所以下面的语句执行时不会产生错误。

const MY_OBJECT = {"key": "value"};
MY_OBJECT.key = "otherValue";

同样的,数组的被定义为常量也是不受保护的,所以下面的语句执行时也不会产生错误。

const MY_ARRAY = ['HTML','CSS'];
MY_ARRAY.push('JAVASCRIPT');
console.log(MY_ARRAY); //logs ['HTML','CSS','JAVASCRIPT'];