JavaScript复习之var,let,const,function小总结

本文详细介绍了JavaScript中的var、let、const关键字以及function的使用。var允许二次定义并存在变量提升,可能导致全局作用域污染;let具有块级作用域和暂时性死区;const必须初始化且不可重新赋值,但对象属性可以修改;function会函数提升,重复定义不会覆盖原有函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于var

1.允许二次定义

var x = 10;console.log(x);//10
var x = 20;console.log(x);//20

2.存在变量提升

var x = 10;
function test(){
console.log(x);//undefined
var x = 10;
 }
test();

3.变量提升个人理解
根据文章let深入理解的理解,变量创建步骤细分为:创建>初始化>赋值。
当调用test函数,进入一个执行环境,收集变量对象(变量,test函数内的函数),提升到该环境顶端,创建var定义的变量x,同时初始化为undefined。
所以var变量提升包括创建和初始化undefined。
4.污染全局作用域

for(var i =1;i<5;i++){}
console.log(window.i);//5

5.隐式变量不存在提升

console.log(a);//Uncaught ReferenceError: a is not defined
a = 'aaa';

关于let

1.存在块级作用域

{ let x = 10;} console.log(x);//x is not defined

2.暂时性死区
暂时性死区:变量必须先定义再使用。

var x =10;
function test(){
console.log(x);//Cannot access 'x' before initialization
let x = 20;
}
test();

3.暂时性死区理解,let存在变量提升吗?
打印x报错,提示想要访问x必须先初始化。
当调用test函数,进入一个执行环境,收集变量对象(变量,test函数内的函数),提升到该环境顶端,创建let定义的变量x,但let定义的变量只有[创建]阶段提升了,[初始化]阶段没提升,而没初始化就不给访问,报错。
所以还是存在提升的,只不过是[创建]阶段提升了。
4.let解决延迟打印问题

for(var i=1;i<5;i++){
           setTimeout(()=>{
               console.log(i);
           },1000);
       }//打印4个5
for(let i=1;i<5;i++){
           setTimeout(()=>{
               console.log(i);
           },1000);
       }//打印1 2 3 4

为什么出现这种情况?
for循环执行了4次,一共创造了4个执行环境,每个执行环境都有对应的i,但是var定义的i没有块级作用域的概念,所以i都是定义在全局上的,而let定义的i都是保存在块级作用域内的。
在这里插入图片描述
在这里插入图片描述
5.let,const不允许重复定义

{ let x = 5;let x = 10;}//Uncaught SyntaxError: Identifier 'x' has already been declared
{let x = 5;var x =10;}//Uncaught SyntaxError: Identifier 'x' has already been declared
{let x = 5;const x =10;}//Uncaught SyntaxError: Identifier 'x' has already been declared
{const x = 5;let x = 5}//Uncaught SyntaxError: Identifier 'x' has already been declared

关于const

1.const声明必须带着初始化

const x;
x = 5;
console.log(x);//Uncaught SyntaxError: Missing initializer in const declaration

2.const只能初始化一次

const x = 10;
x = 5;
console.log(x);//Uncaught TypeError: Assignment to constant variable.

如果const保存着对象,那么修改对象的值是可行的。

const obj = {
name:'san',
age:22
};
obj.age = 100;
console.log(obj.age);//100

3.关于const的变量提升

var x = 10;
function test(){
console.log(x);
const x = 45;
}
test();//Uncaught ReferenceError: Cannot access 'x' before initialization

const只有[创建]和[初始化],当进入执行上下文,收集变量对象时,只有[创建]这个阶段被提前了。所以提示未初始化不能访问x。

关于function

1.函数提升

function test(){
           fn();//fn被执行了
           console.log(fn);//fn(){console.log('fn被执行了')}
           function fn(){
            console.log('fn被执行了');
           }
       }
       test();

函数提升是函数名和函数体都提升了。
2.重复定义函数
重复定义的函数还是使用原来分配的内存。

function test(){
           console.log('test1');        
       }
function test(){
           console.log('test2');
       }
       test();//test2

3.变量提升和函数提升
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖。

console.log(a);//ƒ a(){}
var a = 10;
function a(){}
console.log(a);//10

等同于

function a(){}
var a;
console.log(a);//ƒ a(){}
a = 10;
console.log(a);//10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值