当前位置: 首页 > news >正文

作用域 变量提升(Hoisting)的代码输出题

🧩 题目 1:函数声明 vs 变量声明

console.log(a);
var a = 1;
function a() {}
console.log(a);

✅ 输出:

ƒ a() {}
1

🧠 解析:

  1. 函数声明变量声明 都会被提升;

  2. 但函数声明的优先级 高于 变量声明;

  3. 执行顺序:

    • 声明阶段:function a() {} 被提升;
    • 再执行 var a = 1(只是赋值,不再提升);
  4. 所以第一次打印是函数,第二次打印是数值。


🧩 题目 2:函数声明在块级作用域中的提升(ES6 陷阱题)

function test() {console.log(a);if (true) {function a() {}}console.log(a);
}
test();

✅ 输出:

undefined
ƒ a() {}

🧠 解析:

  1. 在 ES6 之后,函数声明在块级作用域中行为有特殊规定
  2. 在非严格模式下:
    块级函数声明会被当作“变量声明 + 函数赋值”处理。
    • 函数声明会被提升到函数作用域顶部(不是块内)
    • 但在声明之前访问时是 undefined
  3. 因此第一次是 undefined,执行完 if 后函数可用。
  4. 所以内部相当于:
function test() {var a;             // 提升,a = undefinedconsole.log(a);    // → undefinedif (true) {a = function a() {}; // 执行到这里才赋值}console.log(a);    // → ƒ a() {}
}

💡 加分点:你可以补一句
“在严格模式('use strict')下,块级函数声明不会提升,第一次会报错。”


🧩 题目 3:let 与 var 的区别(TDZ)

console.log(a);
let a = 10;

✅ 输出:

ReferenceError: Cannot access 'a' before initialization

🧠 解析:

  • let 声明也会被“提升”(只是不会初始化);
  • 在声明之前访问变量会触发 暂时性死区(TDZ)
  • 因此抛出 ReferenceError

🧩 题目 4:变量提升与函数表达式

console.log(foo);
var foo = function() {console.log('bar');
}
foo();

✅ 输出:

undefined
bar

🧠 解析:

  • var foo 声明被提升,但赋值部分不会;
  • 所以第一次打印 undefined
  • 之后 foo 被赋值为函数,执行时输出 'bar'

🧩 题目 5:变量提升与函数作用域

var a = 10;
function test() {console.log(a);var a = 20;console.log(a);
}
test();

✅ 输出:

undefined
20

🧠 解析:

  • 由于 var 存在函数级作用域,test() 内部的 a 会被提升;

  • 相当于:

    function test() {var a;console.log(a); // undefineda = 20;console.log(a); // 20
    }
    
  • 外部 a=10 被局部变量遮蔽。


🧩 题目 6:函数声明与同名变量(高频陷阱)

function foo() {console.log(a);var a = 1;console.log(a);function a() {}console.log(a);
}
foo();

✅ 输出:

ƒ a() {}
1
1

🧠 解析:

  1. 声明阶段:

    • function a() {} 被提升;
    • var a 只声明不覆盖函数;
  2. 执行阶段:

    • 第一次打印函数;
    • 然后赋值 a = 1
    • 后续打印都是 1

🧩 题目 7:嵌套作用域与提升顺序

var a = 1;
function foo() {console.log(a);var a = 2;function bar() {console.log(a);}bar();
}
foo();

✅ 输出:

undefined
2

🧠 解析:

  • foo 内部的 var a 被提升,遮蔽外层的 a = 1

  • 执行顺序:

    1. 声明阶段:var afunction bar 提升;
    2. 执行 console.log(a)undefined
    3. 赋值 a = 2
    4. bar() 打印 2

🧠 面试技巧总结:

考点记忆口诀
1️⃣ var 提升声明提升,赋值不提升
2️⃣ function 提升整个函数体都提升,优先级高于 var
3️⃣ let / const有 TDZ,不可在声明前访问
4️⃣ 块级作用域let/const 有块级作用域,var 无
5️⃣ 同名函数/变量函数声明优先于 var 声明,但不优于 var 赋值

http://www.dtcms.com/a/525710.html

相关文章:

  • 商城网站建设最好的公司免费网站打包app
  • 网站没有关键词自己做的网站如何上首页
  • 【Matlab】异常处理:MException
  • 郑州友网站建设四川省建设监理协会网站
  • 本地部署Docsify生成文档网站并实现公网环境远程访问
  • 有做a50期货的网站服务周到的微网站建设
  • Linux:开源时代的隐形基石
  • 毕业设计做企业门户网站搭建网页的基础语言
  • 破解本地生活 “到店-复购“ 断层!我店+微团双模式,核销率提升90%
  • 仿qq商城版淘宝客网站源码模板+带程序后台文章dede织梦企业程序网站做担保交易平台
  • Rust中的智能指针
  • 网站建设论文提纲论坛门户网站开发
  • 有哪些单页网站网站建设代码走查
  • 四线城市做网站建设怎么样网页设计与制作全过程
  • Telegram tdlib客户端Java本地编译打包
  • 上海做网站的公司是什么桂林象鼻山景区介绍
  • 阿里云渠道商:OSS与传统存储系统的差异在哪里?
  • Redis事务和Lua脚本对比
  • 广州微信网站建设报价表宝塔建站系统
  • Git 日常
  • 2. C语言 多级指针
  • 素材下载网站模板深圳企业网络推广运营技巧
  • 前沿技术借鉴研讨-2025.10.21(数据缺失填补/提取信号/分类)
  • StarRocks笔记
  • 便捷商铺源码聊天交友定制程序开发源码二开
  • STM32的四种延时方法
  • 手机网站怎么制作织梦网站备份几种方法
  • 网站设计答辩ppt大宗贸易平台
  • 【大模型与OCR】配合应用的示例demo
  • 门户网站内容建设岗位职责国家单位网站建设要多久