Javascript中变量函数申明优先级

案例一
console.log(a); //输出function a(){}
function a() {};
var a=3;


案例二

function a() {};
var a=3;
console.log(a);//输出3


为什么两者输出不一样呢?

解析:

针对案例一

其执行流程可以细化为

1.首先会申请一个空间,开始申明函数a,然后在执行申明变量a,发现已经有a的声明,于是不进行申明

2.然后,就执行console.log(a);即输出函数a

3.最后执行在执行赋值操作,将a=3,这时候函数a就被转为变量类型,并赋值为3。为了验证,可以将程序改为如下

a();
function a() {
	console.log(5);
};
var a=3;
a();
可以发现程序执行结果如下:


因为在赋值之前,a仍然是函数,当执行赋值语句后,a变为3了,执行a()就会报错。

针对案例二

同理可以知,首先申明了函数a,然后在执行申明变量a,发现已经有a的声明,于是不进行申明,接下来,执行了赋值语句,将函数a转为变量。最后输出变量a的值


总结:

1)函数被申明的优先级高于变量

2)被声明过的变量名或是函数名不会被重复申明

3)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置


补充

1.下面代码执行结果为

var x=0;
f();
console.log(x);
var f=function(){
	x=1;
}
f();
console.log(x);
function f(){
	x=2;
}
f();
console.log(x);

答案:2 1 1 


### 编程中变量函数优先级比较 在编程语言中,尤其是像 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 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值