变量和函数的声明提前

1.定义

 声明提前:无论是变量还是函数的声明提前都是指他们会所有代码块执行之前就进行变量或者函数的声明

2.使用规则 

 预备知识 window:这里首先了解一下 window 这个东西,在js中window是一个全局对象。

生命周期:从你打开该网页的那一刻到你关闭该网页的最后一刻。

作用范围:整个script即整个js代码

window对我们理解生命提前有什么用:颠覆传统认知,比如可以不用var定义变量吗?如果不用var定义他会报错吗?

事实上,我们可以不用var定义变量,此时变量==wiindow.变量(但要赋初值,否则报错),函数也是同理。这里解释window是因为下面的声明提前会见到这种不用var就定义变量的写法。

比如如下写法是完全没问题的,输出5  6:

a=5;
console.log(a);
window.a=6;
console.log(a);

变量的声明提前

使用var关键字定义变量时,会在所有代码执行之前声明变量(但不会赋值)

但是如果没有使用var关键字定义变量,则没有该特性(不使用var也可以,默认为window.变量)

// 使用var时进行了声明提前,所以不会报错,但使用a时a还未赋值,所以结果为: a=undefined
console.log("a="+a);
var a = 5;
			
//因为没有声明提前,则会报没有定义就使用变量的错---Uncaught ReferenceError: a is not defined
//console.log("a="+a);
//a = 5;

函数的声明提前

使用函数声明形式创建的函数---function 函数名(){},它会在所有代码执行之前创建,所以我们可以在函数声明前使用它

使用函数表达式--- var 变量 = function (){}; 创建的函数,不会被声明提前

//这种方法进行声明提前,所以不会报错,正常运行
fun1();
function fun1(){
}
			
//这种方法不会声明提前,所以报错---Uncaught TypeError: fun2 is not a function
// fun2();
// var fun2 = function (){
// }

完整代码为:(使用时去掉对应代码块的注释即可) 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			/**
			 * 变量的声明提前
			 * - 使用var关键字定义变量时,会在所有代码执行之前声明变量(但不会赋值)
			 * 		但是如果没有使用var关键字定义变量,则没有该特性(不使用var也可以,默认为window.变量)
			 */
			
			// 使用var时进行了声明提前,所以不会报错,但使用a时a还未赋值,所以结果为: a=undefined
			// console.log("a="+a);
			// var a = 5;
			
			//因为没有声明提前,则会报没有定义就使用变量的错---Uncaught ReferenceError: a is not defined
			// console.log("a="+a);
			// a = 5;
			
			
			
			/**
			 * 函数的声明提前
			 * - 使用函数声明形式创建的函数function 函数名(){}
			 * 		它会在所有代码执行之前创建,所以我们可以在函数声明前使用它
			 * 	使用函数表达式 var 变量 = function (){}; 创建的函数,不会被声明提前
			 */
			
			//这种方法进行声明提前,所以不会报错,正常运行
			// fun1();
			// function fun1(){
			// }
			
			//这种方法不会声明提前,所以报错---Uncaught TypeError: fun2 is not a function
			// fun2();
			// var fun2 = function (){
			// }
		</script>
	</head>
	<body>
	</body>
</html>

这就是本文全部内容啦,很高兴你能看到这,你的访问是对我不断更新自己技术最大的支持~

### 编程中变量函数的优先级比较 在编程语言中,尤其是像 JavaScript 这样的动态类型语言,理解变量函数声明之间的优先级是非常重要的。以下是关于普通变量(`var`, `let`, `const`)以及函数声明之间优先级的具体分析。 #### 1. **JavaScript 中的提升机制** JavaScript 的提升机制决定了变量函数声明的行为顺序。具体来说: - 函数声明具有更高的提升优先级,这意味着即使代码逻辑先访问了一个尚未定义的函数名,该函数仍然会被正常识别并可用[^1]。 ```javascript console.log(add(2, 3)); // 输出 5 function add(a, b) { return a + b; } ``` - 对于变量声明而言,只有变量名称被提前到作用域顶部,而其赋值操作则留在原地。如果尝试在实际声明前访问未初始化的变量,则会抛出错误或返回 `undefined`[^1]。 ```javascript console.log(x); // undefined (因为仅提升了声明部分) var x = 10; // 如果使用 let 或 const 则会出现 ReferenceError 错误 console.log(y); let y = 20; ``` #### 2. **不同类型的变量声明对比** ##### (1)`var` 声明 `var` 是最传统的变量声明方式,在整个函数范围内有效,并且存在提升现象。尽管它的名字会在当前上下文中预先注册,但如果没有赋予初始值的话,默认情况下它等于 `undefined`。 ##### (2)`let` `const` 声明 相比之下,`let` `const` 提供了更严格的块级范围控制,同时不会经历同样的“临时死区”问题——即直到执行流到达它们的实际声明位置之前都不能合法引用这些标识符[^1]。 #### 3. **函数声明 vs 函数表达式** 除了普通的变量之外,还需要注意的是函数本身也可以通过两种形式创建:一种是作为独立语句存在的函数声明;另一种则是嵌套在一个更大的结构内部成为另一个对象成员或者立即调用表达式的组成部分之一 —— 即所谓的匿名函数/箭头函数等。 - **函数声明**总是完全地被抬升至顶端,因此可以在任何地方安全地调用他们,即便是在正式定义之前就已经发生了这样的情况[^1]。 - 而对于那些采用函数字面量形式编写出来的实例(比如存储在某些特定变量里的闭包),由于本质上属于常规右值运算的一部分,所以遵循一般性的左值分配规则即可完成相应的绑定过程。 #### 结论总结 综上所述,在大多数现代脚本环境中,当涉及到简单命名实体的时候,通常推荐按照以下次序考虑各自的相对重要程度: 1. 已经明确给出完整实现细节的标准库方法; 2. 用户自定义并通过标准途径引入项目的全局辅助工具集; 3. 局部限定的小型帮助器片段最后才轮得到单独处理的一般数据项容器角色扮演者们出场亮相的机会而已! ```python def example_function(): pass example_variable = None ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小的香辛料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值