var与let区别

本文详细解析了JavaScript中的变量声明(var、let)及其作用域,包括全局和局部作用域、变量提升(hoisting)现象。强调了未声明变量的隐式全局创建及变量不可配置性。此外,还讨论了动态类型特性,并推荐使用let代替var。最后,提到了变量类型的分类(Number、String等)以及在JavaScript严格模式下的影响。
摘要由CSDN通过智能技术生成

var

变量声明,无论发生在何处,都在执行任何代码之前进行处理。用 var 声明的变量的作用域是它当前的执行上下文,它可以是嵌套的函数,或者对于声明在任何函数外的变量来说是全局。如果你重新声明一个 JavaScript 变量,它将不会丢失其值(如下)。

赋值给未声明的变量, 则执行赋值后, 该变量会被隐式地创建为全局变量(它将成为全局对象的属性)。

myName = 'Chris';

function logName() {
  console.log(myName);
}

logName();

var myName;//myName的值不会变化
  • 声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的。
function x() {
  y = 1;   // 在严格模式(strict mode)下会抛出 ReferenceError 异常
  var z = 2;
}

x();

console.log(y); // 打印 "1"
console.log(z); // 抛出 ReferenceError: z 未在 x 外部声明

  • 声明变量是它所在上下文环境的不可配置属性,非声明变量是可配置的(如非声明变量可以被删除)。
var a = 1;
b = 2;

delete this.a; // 在严格模式(strict mode)下抛出TypeError,其他情况下执行失败并无任何提示。
delete this.b;

console.log(a, b); // 抛出ReferenceError。
// 'b'属性已经被删除。

  • 声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建。
console.log(a);                // 抛出ReferenceError。
console.log('still going...'); // 打印"still going..."。

var a;
console.log(a);                // 打印"undefined"或""(不同浏览器实现不同)。
console.log('still going...'); // 打印"still going..."。

建议始终声明变量,无论它们是在函数还是全局作用域内。 而且,在 ECMAScript 5 严格模式下,分配给未声明的变量会引发错误

变量提升

由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明。这意味着变量可以在声明之前使用,这个行为叫做“hoisting”。“hoisting”就像是把所有的变量声明移动到函数或者全局代码的开头位置

只有在 web 文档中运行多行 JavaScript 时才会有这种效果,当在 JavaScript 控制台中键入单独的行,这将不起作用。

因此,建议始终在作用域顶部声明变量全局代码的顶部和函数代码的顶部),这可以清楚知道哪些变量是函数作用域(本地),哪些变量在作用域链上解决。

重要的是,提升将影响变量声明,而不会影响其值的初始化。当到达赋值语句时,该值将确实被分配:

function do_something() {
  console.log(bar); // undefined
  var bar = 111;//只是将声明提前,赋值操作在执行代码后面
  console.log(bar); // 111
}

// is implicitly understood as:
function do_something() {
  var bar;
  console.log(bar); // undefined
  bar = 111;
  console.log(bar); // 111
}

let

var 声明变量时,可以根据需要多次声明相同名称的变量,但是 let 不能。

声明提升操作不再适用于 let 。

建议在代码中尽可能多地使用 let,而不是 var。

变量类型

Number、String、Boolean、Array、Object

动态类型

JavaScript是一种“动态类型语言”,这意味着不同于其他一些语言(译者注:如C、JAVA),您不需要指定变量将包含什么数据类型(例如number或string)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值