js学习——变量及变量提升问题(2)

1. 命名规则:

**变量名命名规则:** 
     *只能由数字、字母、下划线、$生成
     *不能以数字开头
     *不能使用关键字和保留字(一般在编辑器中使用的时候会变色)
     *区分大小写
     *最好做到见名思意(尽量使用英文全称)
     *驼峰式命名:className
      下划线命名:class_name
	var web = "goodnight";
    let $ = "csdn";
    var _dou = "you" ;
	变量名不能是JS语言关键字,比如true、if、class等。

2. 变量声明与赋值:

声明变量的时候直接赋值叫做初始化,如果我们没有赋值给这个变量,系统默认是undefined。

 	var test;
    test = "lxx";
        // 先声明后赋值
 	var test = "lxx";
        // 声明与赋值的结合
  var web = "good",
      name="bad",
      url="https://find.com";
      console.log(url); 
        // 可以同时声明多个变量
        
   var web = url = name = "good";
   console.log(web);
   console.log(url);
   console.log(name);
        
变量可以更换不同类型的数据。
JS中的变量是弱类型,可以保存所有类型的数据,变量没有类型而值有类型。 
  var web = "lxx";
  console.log(typeof web); //string
  web = 87;
  console.log(typeof web); //number
  web = {};
  console.log(typeof web); //object
        // 变量可以更换不同类型的数据。
typeof  输出当前变量或常量的数据类型

3. 变量提升:
运行代码时,解析器会先解析代码,把对变量的声明提升到最前面,这就叫做变量的提升。
例如:下面代码在解析时发现第三行代码 while不能做为变量名,没有到执行环节就出现错误,并不会在控制台输出第二行代码的结果:(体会一下解析过程)

	var a = "lxx";
	console.log(a);
	let while = "bhh";//此行会报错

变量提升:

 	console.log(a);
    var a = 1;
    console.log(a);
    //执行结果会在控制台输出 undefined和1
       
    //以上代码在解析时执行过程:(把声明的语句会提前,赋值的语句位置不变)
    var a;
    console.log(a);//undefined
    a = 1;
    console.log(a);//1           

控制台输出:
在这里插入图片描述
第二个例子:(执行hd函数时,if内的var也会提升,所以控制台还是会输出undefined,在去掉if部分输出的结果就会不同)

    var dou = "fff";
    function hd() {
    	if (false) {
        	var dou = "xxxxxxxxxx";
        }
    	console.log(dou);
    }
    hd();

结果:
在这里插入图片描述

4. TDZ:
TDZ称为暂时性死区。指变量在作用域内已经存在,但必须在let/const声明后才可以使用。

***TDZ可以让程序保持先声明后使用的习惯,让程序更稳定。***

在上面的变量提升中,var声明的变量出现先使用后声明赋值时不会报错,变量提升后只会出现undefined,而**使用let/const声明的变量在声明前存在临时性死区使用会发生错误**:
	console.log(dou);
    let dou = "xxxxxxxxxxx";

运行结果出错:
在这里插入图片描述
在run函数作用域中产生TDZ,不允许变量在未声明前使用。

dou = "xxxxxxx";
function run() {
  console.log(dou);
  let dou = "hhhhhhhhhhhh";
}
run();

在这里插入图片描述
参数也存在这样的问题:
下面代码b没有声明赋值不允许直接使用:

function dd(a = b, b = 3) {}
dd(); //Cannot access 'b' before initialization

a已经赋值,所以b可以使用a变量,下面代码访问正常:

function dd(a = 2, b = a) {}
dd();
  • 变量要先声明后使用
  • 建议使用let/const 而少使用var

学习资源:
学习网址(后盾人):https://www.houdunren.com/
b站视频:https://www.bilibili.com/video/av80536021

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值