2021-5-8:变量

  • 变量可以保存任何类型的数据,目前有3个关键字可以声明变量:var、let和const

  • var在所有版本中均可以使用,而let和const只能在es6及更晚的版本中使用

var关键字

声明变量名
var message;			// 定义一个名为 message 的变量
var message = 'hi';		// 被定义保存字符串值 hi 的变量
var message = 'hi';
	message = 100;		// 合法,但不推荐修改类型
声明作用域
  • 使用 var 定义的变量会成为函数作用域
  function test() {
    var message = 'hi'	//局部变量
  }
  test()
  console.log(message); 	// 出错
  function test() {
    message = 'hi'		//全局变量
  }
  test()
  console.log(message); 	// hi
  • 定义多个变量
  使用逗号分隔
  var message = 'hi',
  	found = false,
  	age = 18
变量提升
  function foo() {
    console.log(age);
    var age = 18;
  }
  foo();  // undefined
  • 以上并不会报错,var 关键字会把声明的变量提升至函数作用域顶部
  function foo() {
    var age;
    console.log(age);
    age = 18;
  }
  foo();  // undefined

let关键字

声明作用域
  if(true) {
    let age = 26;
    console.log(age); // 26
  }
  console.log(age);   // ReferenceError: age is not defined
  // SyntaxError: Identifier 'age' has already been declared
  
  let age;
  let age;
  • 使用 let 声明的变量名会变成块级作用域,无法被外部引用。let 也不允许 同一个作用域出现冗余声明
暂时性死区
  • let 声明的变量不会在作用域中被提升,let 声明之前的执行瞬间被称为 “ 暂时性死区 ”
  // age 不会被提升
  
  console.log(age); 	//  ReferenceError: Cannot access 'age' before initialization
  let age = 18
全局声明
  • let在全局作用域中声明的变量不会成为 window 对象属性,仍然在全局作用域中发生的,相应变量仍然在生命周期内存续,避免页面重复声明同一个变量
for循环
  for(var i = 0; i < 5; i++) {
    setTimeout(function(){
      console.log(i);
    },0)
  }
  • 以上输出 5、5、5、5、5,退出循环的时候,迭代变量保存的是导致循环推出的值,所有 i 都是同一个变量,因而输出的都是同一个最终值,使用 let 时,会在后台为每次迭代循环声明一个新的迭代变量。输出 0、1、2、3、4

const关键字

  • const 与 let 基本相同,const 定义的是常量,不允许修改数值

  • 若引用的是一个对象,则可以修改内部的属性

声明风格及最佳实践

  • 尽量不使用 var,没有块级作用域的概念,会产生变量污染
  • 变量:let
  • 常量:const
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值