【面试题】作用域和闭包

news2024/12/23 16:57:29

1. 作用域

作用域是指变量的合法使用范围
例如下图中,函数fn3内定义的变量a3,无法在函数fn3以外的区域使用。
在这里插入图片描述
作用域分为全局作用域,函数作用域,块级作用域(ES6新增)

  • 全局作用域:变量没有受到函数的约束,在全局中都可以使用,例如图中的变量a
  • 函数作用域:在函数中定义的变量,只能在当前函数中使用。
  • 块级作用域:if、while、for等大括号{}内的区域称为块级作用域。
    在这里插入图片描述

2. 自由变量

自由变量是指一个变量在当前作用域没有定义,但是被使用了。当前作用域中没有该变量,会向上级作用域,一层一层依次寻找,直到找到为止。

如果向上寻找一直找到全局作用域都没找到,则会报错xxx is not defined
在这里插入图片描述

3. 闭包

闭包是作用域应用的特殊情况,有两种表现:函数作为返回值函数作为参数被传递

所有自由变量的查找,是在函数定义的地方,向上级作用域查找,不是在执行的地方进行查找。

  • 函数作为返回值
function create(){
    const a = 100
    return function(){
        console.log(a)
    }
}

const fn = create()
const a = 200
fn()   // 函数的执行结果为 100
  • 函数作为参数被传递
function print(fn){
    const a = 200
    fn()
}

const a = 100
function fn(){
    console.log(a)
}

print(fn)   // 打印的结果是 100

4. this指向

this取什么值,是在函数执行的时候确定的,不是在函数定义的时候确定的。

场景1:普通函数的this指向

function fn1(){
    console.log(this)
}
fn1()

普通函数的this指向window
在这里插入图片描述

场景2:使用call apply bind调用

function fn1(){
    console.log(this)
}
fn1()

fn1.call({x: 100})

const fn2 = fn1.bind({x: 200})
fn2()

this指向call、apply、bind中传入的对象。call和apply调用函数会直接返回结果,但是bind不会直接返回结果,需要将返回值赋给一个新的函数,再执行该函数。
在这里插入图片描述

场景3:作为对象的方法被调用

const zhangsan = {
    name: '张三',
    sayHi(){
        console.log(this)
    },
    wait(){
        setTimeout(function(){
            console.log(this)
        })
    },
    waitAgain(){
        setTimeout(()=>{
            console.log(this)
        })
    }
}
zhangsan.sayHi()    // this指向当前对象
zhangsan.wait()     // this指向 window
zhangsan.waitAgain()  // this指向当前对象

在这里插入图片描述

场景4:在class方法中被调用

class People{
    constructor(name){
        this.name = name
        this.age = 20
    }
    sayHi(){
        console.log(this)
    }
}

const lisi = new People('李四')
lisi.sayHi()    

在这里插入图片描述

5. 实际开发中闭包的应用

5.1 隐藏数据

实现一个简单的cache工具

5.2 点击标签跳出相应数字

// 创建 10 个 '<a>' 标签,点击的时候弹出来对应的序号
let a
for(let i = 0; i < 10; i++){
    a = document.createElement('a')
    a.innerHTML = i + '<br>'
    a.addEventListener('click', function(e){
        e.preventDefault()
        alert(i)
    })
    document.body.appendChild(a)
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS+JS个人网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

MYSQL索引数据结构----B+树

索引数据结构的考量 我们在考虑数据结构的时候&#xff0c;应该首先要知道数据存放在哪里&#xff1f; 而MYSQL的数据是持久化的&#xff0c;所以其数据&#xff08;数据记录索引&#xff09;应该是保存在磁盘里面的。因此当我们要查询某条数据记录时&#xff0c;就会先从磁盘…

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff…

一文理解Linux的基本指令(三分钟学会Linux基本指令)

前沿&#xff1a; 本文小马将把Linux一般比较常见的指令给大家一一列举出来&#xff0c;为了大家忘记某些指令后&#xff0c;可以方便查询记忆&#xff0c;再次小马建议&#xff0c;Linux指令并不需要去特别花时间专门记忆&#xff0c;只需要多进行操作实现就行&#xff01; &a…

算法图解学习3 选择排序

random recording 随心记录 What seems to us as bitter trials are often blessings in disguise. 看起来对我们痛苦的试炼&#xff0c;常常是伪装起来的好运。 选择排序 内存工作原理 背景引入 假设你去看演出&#xff0c;需要将东西寄存。寄存处有一个柜子&#xff0c;柜子…

Go | 函数注意事项

细节汇总 函数的形参列表可以是多个&#xff0c;返回值列表也可以是多个形参列表和返回值列表的数据类型&#xff0c;可以是值类型、也可以是引用类型函数的命名遵循标识符命名规范&#xff0c;首字母不能是数字&#xff0c;首字母大写表示该函数可以被本包文件和其它文件使用…

在线就能设计电商主图的智能平台工具

商品要上新要如何设计新品主图&#xff1f;想设计简约分的主图素材在哪&#xff1f;下面小编教你使用这个在线工具乔拓云&#xff0c;工具内包含了设计主图用到的所有工具&#xff0c;还有海量的电商模板以及免扣素材&#xff0c;都是可以直接使用到主图设计中&#xff0c;不需…

Linux中线程的介绍

目录 一.线程概念 1.什么是线程 二.Linux进程与线程 三.pthread库 3.1线程创建 3.2线程等待 3.2线程终止 3.4分离线程 四.线程ID及进程地址空间布局 一.线程概念 1.什么是线程 1.在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&…

2022亚太杯建模B题思路 : 高速列车的优化设计 小美赛数学建模 B题思路

1 B题&#xff1a;高速列车的优化设计 2022年4月12日&#xff0c;中国高铁复兴CR450多机组成功实现单列列车速度435 km/h&#xff0c;相对速度870 km/h&#xff0c;创造了高铁多机组列车穿越明线和隧道速度的世界纪录。新一代标准动车组“复兴”是中国自主研发的具有全知识产权…

外贸线上推广引流的技巧

外贸网站建成后&#xff0c;很多外贸企业通常会面临一个重要的问题。网站装修和产品布局都很漂亮&#xff0c;但是流量很小。由此可见&#xff0c;外贸网站的引流推广是非常重要的。接下来&#xff0c;米贸搜给大家分享一些外贸网站引流推广的技巧&#xff0c;让网站快速获得流…

浙里办微信小程序上架

一、概述 本指南旨在为“浙里办”单点登录组件提供接入指南&#xff0c;“浙里办”单点登陆组件&#xff0c;上架在IRS&#xff0c;为上架在IRS的应用&#xff0c;提供统一的单点登录解决方案&#xff0c;现阶段仅支持微信端的接入。 二、服务创建 IRS 应用管理员在 IRS 应用…

Kali系统MSF模块暴力破解MySQL弱口令漏洞

一、实验环境 1.攻击方&#xff1a; 攻击环境使用KALI系统&#xff08;使用虚拟机搭建&#xff09;的Metasploit模块&#xff0c;msfconsole是metasploit中的一个工具&#xff0c;它集成了很多漏洞的利用的脚本&#xff0c;并且使用起来很简单的网络安全工具。 这里要特别强…

代码随想录64——额外题目【哈希表、字符串】:205同构字符串、1002查找常用字符、925长键按入、844比较含退格的字符串

文章目录1.205同构字符串1.1.题目1.2.解答2.1002查找常用字符2.1.题目2.2.解答3.925长键按入3.1.题目3.2.解答4.844比较含退格的字符串4.1.题目4.2.解答4.2.1.使用栈4.2.2.从后往前双指针1.205同构字符串 参考&#xff1a;代码随想录&#xff0c;205同构字符串&#xff1b;力扣…

MySQL数据库的索引

文章目录一、索引是什么&#xff1f;索引的作用二、索引的使用查看索引创建索引删除索引三、索引的底层一、索引是什么&#xff1f; 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#…

[附源码]java毕业设计医疗预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SQL注入原理、过程、防御方案、RASP概念

一、sql注入原理 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的语句上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息…

第1关:Hive的安装与配置

为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.Hive的基本安装&#xff1b; 2.Mysql的安装与设置&#xff1b; 3.Hive 的配置。 注意&#xff1a;本关实训Hive的安装与配置建立在Hadoop已安装配置好的情况下。 Hive 的基本安装 从 官网 下载Hive二进制包&#xf…

优维科技CTO黎明访谈实录:“大场景+小算法”构建AiOps运维技术哲学

智能运维、自动化运维发展到现在&#xff0c;已经有将近7成的IT管理者学会利用大数据、人工智能产品及解决方案赋能团队&#xff0c;在生产效率、适应性和决策能力等层面实现了切实有效的正向转型。 今天的中国企业&#xff0c;已经在云端新基建、数字化转型的浪潮中实现降本增…

美食杰项目 -- 菜品信息(五)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰菜谱大全效果2. 引入element-ui3. 代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中 实现菜品信息页的效果&#xff0c;和具体代码。 具体实现思路&#xff1a; 跳转…

[附源码]java毕业设计疫情防控期间人员档案追寻系统设计与实现论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…