你可能不是真的理解Var声明提升,不信来看看

2024-08-25 04:20

本文主要是介绍你可能不是真的理解Var声明提升,不信来看看,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你好,我是沐爸,欢迎点赞、收藏和关注。个人知乎

在JavaScript中,var 关键字用于声明变量。与 letconst不同,var 声明的变量具有函数作用域或全局作用域(如果声明在函数外部)。关于 var 声明的一个重要特性是声明提升(Hoisting)

声明提升

声明提升意味着无论 var 变量在函数的哪个位置声明,它都会被视为在函数顶部声明。但是,需要注意的是,只有变量的声明会被提升,而变量的初始化(即赋值)不会被提升。这意味着在变量被实际初始化之前,对于 var 来说,它会被视为 undefined

代码示例

function testVarHoisting() {console.log(a);var a = 2;
}testVarHoisting(); // undefined

注意事项

  • 声明提升只影响声明本身,不影响初始化。
  • 使用 var 可能会导致意外的行为,特别是当在大型或复杂的代码库中时。因此,推荐使用 letconst 来声明变量,因为它们提供了块级作用域,减少了变量泄露到全局作用域或意外覆盖的风险。
  • 在严格模式(strict mode)下,未声明的变量会导致错误,这有助于捕获潜在的错误。然而,var 声明的变量仍然可以被提升。

练习题 1

function complexFunction() {console.log(a); // 输出什么?if (false) {var a = 10;}console.log(a); // 输出什么?var a = "Hello";console.log(a); // 输出什么?
}complexFunction();

答案:undefined,undefined,Hello 【if语句不影响var的变量提升,无论真假】

练习题 2

function complexFunction() {console.log(a); // 输出什么?if (true) {var a = 10;}console.log(a); // 输出什么?var a = "Hello";console.log(a); // 输出什么?
}complexFunction();

答案:undefined,10,Hello

练习题 3

console.log(x); // 输出什么?var x = 2;function f() {console.log(x); // 输出什么?var x = 3;console.log(x); // 输出什么?
}f();console.log(x); // 输出什么?

答案:undefined,undefined,3,2

练习题 4

"use strict"; // 严格模式console.log(x); // 输出什么?var x = 2;function f() {console.log(x); // 输出什么?var x = 3;console.log(x); // 输出什么?
}f();console.log(x); // 输出什么?

答案:undefined,undefined,3,2 【严格模式不影响var的声明提升】

练习题 4

console.log(x); // 输出什么?var x = 2;function f() {x = 3;          // 输出什么?console.log(x); // 输出什么?var x = 4;console.log(x); // 输出什么?
}f();console.log(x); // 输出什么?

答案:undefined,3,4,2【函数作用域的同名变量不会给外层变量赋值】

练习题 5

function test(x) {var x = "local";console.log(x); // 输出什么?
}test(10);

答案:“local”

function test(x) {console.log(x);  // 输出什么?var x = "local";console.log(x); // 输出什么?
}test(10);

答案:10,“local”【函数参数的优先级高于变量提升】

练习题 6

for (var i = 0; i < 3; i++) {setTimeout(function () {console.log(i); // 输出什么?}, 1000);
}

答案:3,3,3 【var为全局变量,定时器回调在循环结束后执行】

练习题 7

var name = "World!";
(function() {if (typeof name === "undefined") {var name = "Jack";console.log("Goodbye " + name)} else {console.log("Hello "+ name);}
})();

答案:Goodbye Jack 【逻辑同习题1,if语句不影响var的变量提升,无论真假】

练习题 8

var msg = "hello";
for (var i = 0; i < 10; i++) {var msg = 'hello' + i * 2 + i;
}
console.log(msg);

答案:“hello189”【for循环内部的变量会覆盖外层的同名变量】

总结

如果上面的习题你都做对了,那你对var 变量提升问题的理解是比较深刻的,给你点赞👍!

从以上习题中可以看出 var 声明变量存在很多"诡异"情况,特别是赋值前可以访问变量和重复赋值导致很多问题,你有时要看很久才能想明白执行顺序,这极不利于代码的维护,这也是提倡用 letconst 代替 var 的原因。项目开发中,同学们也应该尽量使用letconst代替var

好了,分享结束,谢谢点赞,下期再见。

这篇关于你可能不是真的理解Var声明提升,不信来看看的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104525

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝