JavaScript中var、let、隐式申明变量

近期在学习JavaScript,看到申明变量有点懵,怎么一会var一会let,更有甚者不用关键字申明,于是整理了一下,主要来源MDN文档,如有不严谨的地方以及错误,还望读者指正。


var和let区别:
  • var和let声明后未赋值,表现相同,都是undefined。

  • 使用未声明的变量,表现不同。var正常输出undefined,而let声明的变量会报错 ReferenceError: letTest is not defined 严格模式下

  • 重复声明同一个变量时,表现不同:var可以更改,而let再次声明变量时,会报错SyntaxError: Identifier ‘letTest’ has already been declared

  • let声明的变量只在其声明的块或子块中可用,这一点,与var相似。二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数

function varTest() {
  var x = 1;
  { //块
    var x = 2;  // 同样的变量! 因为在同一个函数里面
    console.log(x);  // 2
  }
  console.log(x);  // 2
}// 函数外依旧访问不到var变量

function letTest() {
  let x = 1;
  {
    let x = 2;  // 不同的变量 这个x封在了块中
    console.log(x);  // 2
  }
  console.log(x);  // 1
}


function NONETest() {
     x = 1;//全局的
  {
     x = 2;  // 不同的变量
    console.log(x);  // 2
  }
  console.log(x);  // 2
}
  • 变量作用范围不同:let 语句声明一个块级作用域的本地变量, var声明的变量只能是全局或者整个函数块的。 varlet 的不同之处在于后者是在编译时才初始化。let不像 var 一样,let不会在全局对象里新建一个属性。位于函数或代码顶部的var声明会给全局对象新增属性, 而let不会。
var x = 'global';
let y = 'global';
console.log(this.x); // "global" var会在全局对象新建属性
console.log(this.y); // undefined let不会新建全局属性
  • 还有非声明变量。未能声明变量将很可能导致意想不到的结果。因此,建议始终声明变量,无论它们是在函数还是全局作用域内
var x = 0;
function f(){
  var x = y = 1; // x在函数内部声明,y不是!
}
f();
console.log(x, y); // 0, 1
// x 是全局变量。x的值还是0,并不是1
// y 是隐式声明的全局变量。 
-------------------------------------
function x() {
  y = 1;   // 在严格模式(strict mode)下会抛出 ReferenceError 异常
  var z = 2;
}
x();
console.log(y); // 打印 "1"
console.log(z); // 抛出 ReferenceError: z 未在 x 外部声明
//隐式声明的变量总是全局的。而var声明变量的作用域限制在其声明位置的上下文中。
var x = 0;  // x是全局变量,并且赋值为0。
function a() { 
  var y = 2;   // y被声明成函数a作用域的变量,然后赋值成2。
  function 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)变量。

个人总结:
(1)隐式声明的变量,是全局的,并且值也是最新赋的值。
(2)let和var声明的变量,如果先声明在函数外,var x=0然后在函数中又重新声明一次var x=1,最后函数外访问不到函数中重新声明的变量的新的值,因为声明的变量只在其声明的块或子块中可用,在函数中申明的x是新的变量。
(3)let只能在其块中{}有效,而var作用域在整个当前函数中.如果let只声明在函数中,也只在函数中有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值