Javascript 函数声明 的优先级 高于 变量声明的优先级,但 不会 覆盖变量赋值

本文通过三段示例代码详细解析了JavaScript中变量与函数声明的规则,特别是关于声明提前、函数表达式中标识符的有效范围等问题。

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

一段代码及输出如下:

b = c;

b();
console.log(a);    //1
console.log(b);    //2
console.log(c);    //3

function c() {
    a = 1, b = 2, c = 3;
};

将上述代码稍作修改:

b = function c() {
    a = 1, b = 2, c = 3;
};

b();
console.log(a);    //1
console.log(b);    //2
console.log(c);    //Uncaught ReferenceError: c is not defined

再次将上述代码稍作修改:

b = function c() {
    a = 1, b = 2, c = 3;
    console.log(a);    //1
    console.log(b);    //2
    console.log(c);    //fuction c(){...
};
b();

不知所以然,如何才能正确解释上述三段代码中的变了C?

众所周知,JS的变量和函数声明都会被存储到执行上下文的变量对象(或活动对象)中,即声明提前。

函数声明 的优先级 高于 变量声明的优先级,但 不会 覆盖变量赋值。

对于 var bar = function foo(){}; 语句,其实就是一个有效的命名函数表达式,但有一点需要记住:这个名字只在新定义的函数作用域内有效,因为规范规定了标示符不能在外围的作用域内有效:

var f = function foo(){
    return typeof foo; // foo是在内部作用域内有效
};
// foo在外部用于是不可见的
typeof foo; // "undefined"
f(); // "function"

记住一点: 命名函数表达式的标示符(即函数名称)在外部作用域是无效的

var bar = function foo(){}; // 命名函数表达式,因为它是赋值表达式的一部分


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值