理解js中不同变量与常量声明及作用域的概念

目录

        一、介绍

        二、var变量

        三、let块级变量

        四、const常量

一、介绍

        在javascript的运行环境中,变量是非常重要的存在。通过它改变数据,从而影响文档视图。

        变量如同他的名字一样,可以变化的量。

        变量的作用 : 容器,用于数据存储          

  •   声明变量时需要注意的点 :

    1. 字母、数字、下划线 、$符号都可以作为变量名字的开头,数字不可以
    2. 不可以使用关键字,保留字作为变量名
    3. 变量名区分大小写
    4. 推荐使用驼峰命名法进行命名
    5. 可以使用中文作为变量名,但并不推荐使用   

 二、var变量

        当声明一个变量时

var user = "张三";
console.log(user);

        当声明多个变量时

var user,age,sex;
user = "张三";
age = 18;
sex = "男";
console.log(user); // 张三
console.log(age);  // 18
console.log(sex);  // 男

        以上代码需要注意的是 : 

        如果在后面的变量赋值之前进行调用的话,按照js代码从上向下执行的规则,会因为只声明,而没有赋值而导致查找不到

var user;
console.log(user); // undefined
neme = "张三";
console.log(user); // 张三

        当声明多个变量并赋值时

var user = "李四傻123abc" , age = 20 , sex = "男";
console.log(user,age,sex); // 李四傻123abc 20 男

三、let块级变量

         在es6之前,javaScript声明变量的方式只有var一种,但是var声明的方式很单调,而且也存在着许多不规范、不合理的地方。那时的 js 想成为一门和 java、c、python 等同量级的编程语言,所以就有必要去解决这些问题。

        于是乎,let块级变量和const常量便出现了。

  •    let声明相较于var声明变量的区别

    • 块级变量,在块级作用域中的表现不同
    • 不允许变量提升
    • 会出现系统函数暂时性死区(TDZ)
    • 不可以重复声明

        下面就通过代码来具体说明一下他们的区别在哪里


        1、块级变量,在块级作用域中的表现不同

        在说let块级作用之前,需要了解一个概念,就是 “ 块 ”。

        块级作用域,即 {} (大括号)里面的内容。

        在es6之前,js对于块级的概念是很模糊的,块级本身的概念是在块内定义的内容,即大括号里的内容,外部是并不能访问到的。但是你会发现,好像只有函数的大括号内部声明的变量,外部是访问不到,像for循环、if判断、switch判断等等这些里面声明的变量,外部是都能够可以访问到的,这样失去了块的概念。

function onceFun(){
	var age = "史珍香";
	console.log(age); // 史珍香
}
onceFun(); 
console.log(age); // 查找不到而报错


if(true){
    var link = "厚涂";
}
console.log(link); // 厚涂

        在let中,块级内使用let声明的变量,只能在当前块级内查找与调用

if(true){
    let user = "Hello World";
}
console.log(user); // 报错

        子块可以访问到父块let声明的变量,父块却不能访问子块的,同级块相互不可以访问

{
    let user = "hello";
    {
        console.log(user); // hello
        let year = "18";
    }
    console.log(year); // 报错
}

        var 与 let 的差别在以后的使用中也是比较明显的

<ul>
	<li>春</li>
	<li>夏</li>
	<li>秋</li>
	<li>冬</li>
</ul>

<script>
    let list = document.querySelectorAll("li");
	for(var i=0;i<list.length;i++){ // 使用var声明 i 变量
	    list[i].onclick = function(){
	        console.log(i); // 这里无论点击哪里,打印结果都是for循环执行完成后i的结果4            
        }
    }
</script>

        以上代码无论点击哪个li,打印的结果都是 4。因为for循环中使用 var 声明的变量,是不会考虑块这个概念的,打印的都是整个for循环执行完成后的结果 i 。而如果换成 let 声明变量 i 的话,则每次循环都是在当前块内执行的的,所以当点击 li 时打印的都是当前块内 i 执行到的值


        2、不允许变量提升

        在js中遵循着代码从上向下执行的规则,但是会出现一些问题

console.log(user); // undefined
var user = "你好世界";

// 相当于

var user;
console.log(user); // undefined
user = "你好世界";

        正常来说,变量是在下面定义的,在上面访问时是访问不到的,但是var声明却将变量名进行了提前声明,这是非常不合理的,不过let声明的话就直接性的解决了这个问题。

console.log(user); // 报错
let user = "你好世界";

        3、会出现系统函数暂时性死区(TDZ)

console.log(typeof c); // 导致函数调用失败
let c = "hello";  

        4、不允许重复声明

var year = 18;
var year = 88;
console.log(year); // 88


let sex = "男";
let sex = "女";
console.log(sex); // 报错

        如果使用var重复声明一个变量,那么造成的结果就是后者声明覆盖前者,但换成let的话,会直接报错。

        需要注意的是,不同修饰符声明的相同变量,会直接报错。

四、const常量

        相较于 var 和 let ,const常量就比较简单明了。

  •  const常量的特点:
    •  不允许只声明不赋值
    •  常量名推荐全部大写
    •  不允许重复声明,也不允许声明后修改

        顾名思义,常量是需要经常存在的量。所以,一旦声明了,就不要去动它,你也动不了它。


        不允许只声明不赋值

const TNUYIE; // 报错
console.log(TNUYIE); // 报错

       不允许重复声明,也不允许声明后修改

const LINK = "run";
const LINK= "play table tennis"; // 报错
console.log(LINK); // 报错
const LINK = "run";
LINK= "play table tennis"; // 报错
console.log(LINK); // 报错

        希望能够有所帮助!

猜你喜欢

转载自blog.csdn.net/weixin_60678263/article/details/126354506