var 声明变量的作用域限制在其声明位置的上下文中
- var x = 0; // x 是全局变量, 并且赋值为 0.
- console.log(typeof z); // undefined, 因为 z 还不存在.
- function a() { // 当 a 被调用时,
- var y = 2; // y 被声明成函数 a 作用域的变量, 然后赋值成 2.
- console.log(x, y); // 0 2
- function b() { // 当 b 被调用时,
- x = 3; // 全局变量 x 被赋值为 3, 不生成全局变量.
- y = 4; // 已存在的外部函数的 y 变量被赋值为 4, 不生成新的全局变量.
- z = 5; // 创建新的全局变量 z, 并且给 z 赋值为 5.
- } // (在严格模式下 (strict mode) 抛出 ReferenceError)
- b(); // 调用 b 时创建了全局变量 z.
- console.log(x, y, z); // 3 4 5
- }
- a(); // 调用 a 时同时调用了 b.
- console.log(x, z); // 3 5
- console.log(typeof y); // undefined, 因为 y 是 a 函数的本地 (local) 变量.
let 声明的变量只在其声明的块或子块中可用, var 的作用域是整个封闭函数
- function varTest() {
- var x = 1;
- if (true) {
- var x = 2; // 同样的变量!
- console.log(x); // 2
- }
- console.log(x); // 2
- }
- function letTest() {
- let x = 1;
- if (true) {
- let x = 2; // 不同的变量
- console.log(x); // 2
- }
- console.log(x); // 1
- }
在 ECMAScript 2015 中, let 绑定不受变量提升的约束, 这意味着 let 声明不会被提升到当前执行上下文的顶部.
在块中的变量初始化之前, 引用它将会导致 ReferenceError(而使用 var 声明变量则恰恰相反, 该变量的值是 undefined )
当在块中使用时, let 将变量的作用域限制为该块. 注意 var 的作用域在它被声明的函数内的区
- var a = 1;
- var b = 2;
- if (a === 1) {
- var a = 11; // the scope is global
- let b = 22; // the scope is inside the if-block
- console.log(a); // 11
- console.log(b); // 22
- }
- console.log(a); // 11
- console.log(b); // 2
const 常量必须在声明的同时指定它的值.
const 声明创建一个值的只读引用. 但这并不意味着它所持有的值是不可变的(如引用内容是对象), 只是变量标识符不能重新分配一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称
- // 注意: 常量在声明的时候可以使用大小写, 但通常情况下全部用大写字母.
- // 定义常量 MY_FAV 并赋值 7
- const MY_FAV = 7;
- // 报错
- MY_FAV = 20;
- // 输出 7
- console.log("my favorite number is:" + MY_FAV);
- // 尝试重新声明会报错
- const MY_FAV = 20;
- // MY_FAV 保留给上面的常量, 这个操作会失败
- var MY_FAV = 20;
- // 也会报错
- let MY_FAV = 20;
- // 注意块范围的性质很重要
- if (MY_FAV === 7) {
- // 没问题, 并且创建了一个块作用域变量 MY_FAV
- // (works equally well with let to declare a block scoped non const variable)
- let MY_FAV = 20;
- // MY_FAV 现在为 20
- console.log('my favorite number is' + MY_FAV);
- // 这被提升到全局上下文并引发错误
- var MY_FAV = 20;
- }
- // MY_FAV 依旧为 7
- console.log("my favorite number is" + MY_FAV);
- // 常量要求一个初始值
- const FOO; // SyntaxError: missing = in const declaration
- // 常量可以定义成对象
- const MY_OBJECT = {"key": "value"};
- // 重写对象和上面一样会失败
- MY_OBJECT = {"OTHER_KEY": "value"};
- // 对象属性并不在保护的范围内, 下面这个声明会成功执行
- MY_OBJECT.key = "otherValue";
- // 也可以用来定义数组
- const MY_ARRAY = [];
- // It's possible to push items into the array
- // 可以向数组填充数据
- MY_ARRAY.push('A'); // ["A"]
- // 但是, 将一个新数组赋给变量会引发错误
- MY_ARRAY = ['B']
下面介绍下在 javascript 中有三种声明变量的方式: var,let,const.
var 声明全局变量, 换句话理解就是, 声明在 for 循环中的变量, 跳出 for 循环同样可以使用.
- for(var i=0;i<=1000;i++){
- var sum=0;
- sum+=i;
- }
- alert(sum);
声明在 for 循环内部的 sum, 跳出 for 循环一样可以使用, 不会报错正常弹出结果
let: 声明块级变量, 即局部变量.
在上面的例子中, 跳出 for 循环, 再使用 sum 变量就会报错, 有着严格的作用域, 变量只作用域当前隶属的代码块, 不可重复定义同一个变量, 不可在声明之前调用, 必须先定义再使用, 会报错, 循环体中可以用 let
注意: 必须声明'use strict'; 后才能使用 let 声明变量否则浏览并不能显示结果,
const: 用于声明常量, 也具有块级作用域 , 也可声明块级.
const PI=3.14;
它和 let 一样, 也不能重复定义同一个变量, const 一旦定义, 无法修改.
总结
以上所述是小编给大家介绍的 JavaScript 变量声明 var,let.const 及区别浅析, 希望对大家有所帮助, 如果大家有任何疑问请给我留言, 小编会及时回复大家的. 在此也非常感谢大家对脚本之家网站的支持!
来源: http://www.jb51.net/article/138741.htm