javaScript基础面试题 --- JS作用域

2023-11-14

面试10家公司,得有8家会问到作用域的题。所以说JS的作用域一定要弄清楚,非常重要!

1、除了函数之外,JS没有块级作用域
2、作用域链:内部可以访问外部的变量,但是外部不能访问内部变量,如果内部有,优先内部的,如果内部没有,就先查找外部的
3、注意声明变量是用var,还是没有写,如果没写var,直接赋值,就是(window.下面的全局)
4、变量提升
5、优先级:声明变量 > 普通声明函数 > 参数 > 变量提升
普通声明函数,不看写函数的时候的顺序,反正都是要变量提升的,而且取值就是函数本身,这就相当于是,函数不仅声明提升了,定义也提升了


题目:除了函数之外,JS没有块级作用域

结果为:报错
分析:
因为a在函数内部,函数有块级作用域
但是在函数外部,a不仅没声明也没定义
注意:如果没声明没定义就报错,如果声明了,没定义,就是undefined

在这里插入图片描述


结果为:10
分析:
因为JS除了函数以外没有块级作用域
for循环没有块级作用域 i做完循环=10
所以最后打印出来为10

在这里插入图片描述


结果为: 10
分析:
因为JS除了函数以外没有块级作用域
a = 10

在这里插入图片描述


考点:作用域链 – 内部可以访问外部的变量,但是外部不能访问内部变量

结果为:10
分析:
foo内部没有a
根据作用域链,一层一层往外找

在这里插入图片描述


考点:使用了var,就是声明了变量,没使用var的,就是没声明变量

结果:
·a不能打印,会报错,因为a在函数内部声明,具有块级作用域,函数外部没有定义

·b可以打印,结果为10,因为b没有使用var在函数内部声明,b相当于是全局变量windows.b=10相当于是在函数外面声明赋值的

在这里插入图片描述


结果为:
undefined
undefined

分析:
js除了函数,没有块级作用域,所以if不是块级作用域
var a变量提升 所以第一个a是undefined
由于if语句里面是false,所以并没有赋值 第二个a也是undefined

在这里插入图片描述


考点:变量提升

结果:
函数内部的bar变量提升却没有赋值,所以第一个是undefined
第二个赋值了,就是2

在这里插入图片描述


优先级:

结果:10
分析:
声明变量 > 普通声明函数

在这里插入图片描述


结果:f(){}
函数表达式声明,就是a的变量声明

在这里插入图片描述


结果:f(){}
分析:
虽然函数定义在下方,但是打印出来的不是undefined
因为,普通函数声明 取 函数值,不取声明值
这意味着:在普通声明函数上方调用,或者在普通声明函数下方调用,这个顺序是没影响的

在这里插入图片描述


考点:声明变量 > 普通声明函数 > 参数 > 变量提升

结果:100
分析: 参数 > 变量提升
在这里插入图片描述


声明变量 > 普通声明函数 > 参数 > 变量提升

结果为:10
分析:声明变量 > 普通声明函数 > 参数 > 变量提升

在这里插入图片描述


注意:这里的a是windows下的,其实a不在函数块级作用域内,它其实是windows.a,在函数外部找到的

在这里插入图片描述


结果为:20
分析:a其实是windows下的,但是本作用域中有var a = 20,所以最后是20


结果为:10
分析:这是上面题反过来,这是变量的再赋值了,所以是10

在这里插入图片描述


这个也是变量的再次赋值

结果:10
分析:
首先是var a变量提升
然后,a = 10,变量的赋值

在这里插入图片描述

2、普通函数声明、函数表达式、箭头函数有什么区别?

在 JavaScript 中,普通函数声明、函数表达式、和箭头函数在语法和行为上有一些区别。下面是主要的区别:

1. 普通函数声明(Function Declaration)

普通函数声明在其作用域内会被提升(hoisted)。

foo(); // 可以调用,因为函数提升
function foo() {
  console.log('普通函数声明');
}
  • 拥有自己的 thisargumentssupernew.target
  • 可以使用 new 运算符调用(即作为构造函数)。
  • 可以被提升。

2. 函数表达式(Function Expression)

函数表达式定义了一个匿名函数,或者可以命名,但是不会被提升。

foo(); // TypeError: foo is not a function

var foo = function() {
  console.log('函数表达式');
}
  • 与普通函数声明相似,拥有自己的 thisargumentssupernew.target
  • 可以使用 new 运算符调用(即作为构造函数)。
  • 不会被提升。

3. 箭头函数(Arrow Function)

箭头函数使用 “箭头” (=>) 语法编写。

const foo = () => {
  console.log('箭头函数');
}
  • 没有自己的 thisthis 的值继承自包围它的函数(词法 this)。这使得箭头函数在某些场景中更为方便,比如在回调函数中。
  • 没有 arguments 对象。如果你需要访问参数列表,你需要使用剩余参数(...args)。
  • 不能使用 new 运算符调用。箭头函数没有 [[Construct]] 方法,因此不能作为构造函数。
  • 没有 supernew.target

总结:

  • 普通函数声明可以被提升,而函数表达式和箭头函数不能。
  • 箭头函数不绑定自己的 this,并且缺少普通函数和函数表达式的一些特性,如 arguments 对象。
  • 普通函数声明和函数表达式在功能上相似,但函数表达式不会被提升。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javaScript基础面试题 --- JS作用域 的相关文章

随机推荐

  • 学会QT从这里开始——教你快速学会QT

    为了提高提高推文质量 最近又再翻看QT书籍 不知道大家有没有发现 QT书籍大多都是从环境 安装 控件开始讲解 好 现在开始学习吧 1 环境安装 2 新建项目 3 学习控件 QButton QLable QLineEdit QTextEdit
  • nacos2.2.1集成达梦数据库

    nacos2 2 1集成达梦数据库 1 下载源码 https github com alibaba nacos 2 新增达梦驱动依赖 父pom xml
  • openwrt篇修改WiFi热点默认名称和主机名

    在如下图文件中 修改ssid 在如下图文件中修改hostname
  • Linux的用户空间与内核空间

    一 简介 Linux 操作系统和驱动程序运行在内核空间 应用程序运行在用户空间 两者不能简单地使用指针传递数据 因为Linux使用的虚拟内存机制 用户空间的数据可能被换出 当内核空间使用用户空间指针时 对应的数据可能不在内存中 用户空间的内
  • vue3项目引入高德地图详细方法教程

    项目需求需要引入地图 对于目前最新的Vue3 0 无论是百度 高德 腾讯地图目前还没有适配 只有Vue 2 x版本的 目前只有谷歌地图的Vue3 0适配 但是没有适配并不代表不能使用 下面就来教大家如何使用 1 在高德开发平台申请你的key
  • react定义函数,默认函数参数的方式

    参数是 对象 有传入参数用传入参数作为入参数 无传入参数用默认值 getTableData async pageData gt const params Object assign currPage 1 pageSize this stat
  • 网传字节跳动实习生删除GB以下所有机器学习模型,差点没上头条

    作者 陈大鑫 陈彩娴 来源 AI科技评论 昨晚脉脉上有网友爆料 字节跳动一位实习生删除了公司所有轻量级别的机器学习模型 什么是lite模型 该楼主表示 lite模型就是公司内几乎所有GB大小以下的机器学习模型 且全部被删除了 实习生直接删除
  • 公司固定资产怎么明细管理

    固定资产的管理是一个至关重要的环节 它不仅影响到企业的运营效率和经济效益 也直接影响到公司的长期发展 因此 对固定资产进行精细化管理 是每一个负责任的企业都应该做到的 本文将探讨如何通过创新的方式 实现公司固定资产的明细管理 我们需要明确什
  • 设置vscode终端的最大输出行

    使用vscode终端输出的时候 如果输出的行数很多 之前打印的东西就看不到了 因此需要设置一下终端输出的最大行数来保留之前的信息 terminal integrated bell scrollback
  • MMDet——EMA更新hook详解

    Hook 首先需要明白mmdet中hook机制 EMA就是建立在Hook机制上的 推荐一个Hook详解 深度理解目标检测 MMdetection HOOK机制 EMA 指数平均 exponential mean average 一般来说 在
  • 使用Google Guava Cache Util工具类实现本地缓存设置过期时间的Java应用

    使用Google Guava Cache Util工具类实现本地缓存设置过期时间的Java应用 随着互联网应用的发展 缓存成为提高系统性能和响应速度的关键技术之一 而在Java开发中 Google Guava提供了一个强大的缓存工具类 Ca
  • 关于数据库表字段的数据权限设计

    吐槽 刚在同事的帮忙下 把maven工程成功导入到eclipse 期间遇到的最大问题就是安装eclipse插件 花费了其中大部分的时间 现在做的研发产品 遇到的一个新的需求是 控制外部系统对于表中字段的访问权限 其实说白了 就是 对于CRU
  • sklearn机器学习包中的对原始数据的预处理及训练集、测试集的分割

    sklearn机器学习包中的对原始数据的预处理及训练集 测试集的分割 一 数据预处理 1 标准化 2 归一化 3 最小最大标准化 4 缺失值插补 二 训练集测试集的划分 一 数据预处理 sklearn preprocessing 包提供了几
  • 编码-整数

    计算机中存储的数值 正数为其原码 而负数存的是其补码 正数 原码 用最高位表示符号位 其余位表示数值 其中 正数的符号位为 0 负数的符号位为 1 正整数转成二进制 除二取余 直到商为零或一时为止 然后倒序排列 举个栗子 121 gt 0
  • 【蓝桥杯】什么算法才是版本答案?近三年(2019-2021)蓝桥杯省赛涉及算法出现频率分析

    2022年的蓝桥杯比赛已经基本报名结束 寒假来临 如何抓住重点 快速掌握各种算法知识 在4月份的蓝桥杯省赛中取得好成绩呢 本文收集了近三年的4场蓝桥杯省赛题目 2019年 2020年第二场 2020年第三场 2021年 并总结了题目涉及的算
  • python是一门机器语言_python是一门怎样的编程语言?

    大家应该都听说过python语言 也知道它是一门非常适合零基础学习的语言 但是对于没有接触过的人来说可能就疑惑python到底是一门什么样的编程语言 1 跨平台 跨平台不依赖操作系统和硬件环境 某个操作系统环境下开发的应用 放在其他的系统中
  • angular中的组件嵌套

    1 创建3个包 header module main module sliderbar module 2 在header module创建三个组件 header center heder left header right 3 z将三个组件
  • BP神经网络回归预测-MATLAB代码实现(代码完整直接可用,注释详细,可供新手学习)

    一 前言 代码获取 私信或附评论区 BP神经网络预测回归MATLAB代码 代码完整可用 复制后即可运行使用 操作简单 1 BP神经网络的知识想必不用再过多介绍 本篇文章从实际应用的角度 针对新手应用者 针对不需要过多了解BP 但是需使用MA
  • Java-主流框架—(4)SpringMVC

    1 SpringMVC概述 三层架构 表现层 负责数据展示 业务层 负责业务处理 数据层 负责数据操作 MVC Model View Controller 一种用于设计创建Web应用程序表现层的模式 Model 模型 数据模型 用于封装数据
  • javaScript基础面试题 --- JS作用域

    面试10家公司 得有8家会问到作用域的题 所以说JS的作用域一定要弄清楚 非常重要 1 除了函数之外 JS没有块级作用域 2 作用域链 内部可以访问外部的变量 但是外部不能访问内部变量 如果内部有 优先内部的 如果内部没有 就先查找外部的