千家信息网

Javascript作用域与闭包有什么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍Javascript作用域与闭包有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、作用域简单来说,作用域是指程序中定义变量的区域,它决定了当前执行代码对
千家信息网最后更新 2026年11月03日Javascript作用域与闭包有什么用

这篇文章主要介绍Javascript作用域与闭包有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1、作用域

简单来说,作用域是指程序中定义变量的区域,它决定了当前执行代码对变量的访问权限

在ES5中,一般只有两种作用域类型:

  • 全局作用域:全局作用域作为程序的最外层作用域,一直存在

  • 函数作用域:函数作用域只有在函数被定义时才会被创建,包含在父级函数作用域或全局作用域中

说完概念,我们来看下面这段代码:

var a = 100function test(){    var b = a * 2    var a = 200    var c = a/2    console.log(b)    console.log(c)}test()      // 这里会打印出什么?

解析:

  • 首先这段代码形成了全局作用域与函数作用域

  • 全局作用域有一个变量a赋值为100

  • 在test函数作用域中定义了局部变量b,a,c

  • 这里又存在变量提升,在函数作用域内先进行变量提升var b; var a; var c;

  • 再对b进行赋值,这时候a还没有被赋值,所以a的值为undefined,再将a*2,所以b为NaN

  • 再给a赋值为200,c赋值为a/2等于100

所以最终会打印出 NaN,100

在ES6中,新增了一种块级作用域

简单来说,花括号{...}内的区域就是块级作用域,但Javascript并不是原生支持块级作用域的,需要借助ES6提出的let、const来创建块级作用域

// ES5if(true) {  var name = '南玖'}console.log(name)  // 南玖// ES6if(true) {  let age = 18}console.log(age)  // 这里会报错

2、作用域链

当可执行代码内部访问变量时,会先查找当前作用域下有无该变量,有则立即返回,没有的话则会去父级作用域中查找...一直找到全局作用域。我们把这种作用域的嵌套机制称为作用域链

3、词法作用域

词法作用域是作用域的一种工作模型,词法作用域是JavaScript中使用的一种作用域类型,词法作用域也可以被叫做静态作用域。

所谓的词法作用域就是在你写代码时将变量和作用域写在哪里来决定的,也就是词法作用域是静态的作用域,在你写代码时就决定了。函数作用域取决于它申明的位置,与实际调用的位置无关

MDN对闭包的定义:

一个函数和对其周围(词法环境)的引用捆绑在一起(或者说函数被引用包围),这样一个组合就是闭包(closure)

也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

我们可以得出:

闭包 = 函数 + 外层作用域

我们先来看段代码:

var name = '前端南玖'function say() {  console.log(name)}say()

解析:say函数可以访问到外层作用域的变量a,那么这样不就是形成了一个闭包吗?

在《Javascript权威指南》书中有这样一句话:严格来讲,所以JavaScript函数都是闭包

但这只是理论上的闭包,与我们平时使用的不太一样。上面这个例子只是一个简单的闭包。

ECMAScript对闭包的定义:

  • 从理论上来讲:所有函数都是闭包。因为它们在创建的时候就已经上层上下文的数据保存起来了。

  • 从实践上来讲:闭包应该满足两个条件:1.在代码中引用了外层作用域的变量;2.即使创建它的上下文已经销毁,它仍然存在;

我们再看一段《JavaScript权威指南》上的代码:

let scope = 'global scope'function checkscope(){  let scope = 'local scope'  function f(){    return scope  }  return f}let s = checkscope()   s()   // 这里返回什么?

很多同学可能觉得是global scope,但真的是这样吗,我们一起来看下它的执行过程:

  • 首先执行全局代码,创建全局执行上下文,定义全局变量scope并赋值

  • 申明checkscope函数,并创建该函数的执行上下文,创建局部变量scope并赋值

  • 申明f函数,创建该函数的执行上下文

  • 执行checkscope函数,该函数又返回了一个f函数赋值给了变量s

  • 执行s函数,相当于执行了f函数。这里返回的scope是local scope。至于为什么是local scope,我们上面讲到了词法

作用的基本规则:JavaScript函数是使用定义它们的作用域来执行的。在定义f函数的作用域中,变量scope的值为local scope

5、闭包的应用

闭包的应用,绝大多是都是在维护内部变量的场景下使用

6、闭包的缺陷

  • 由于闭包的存在可能会造成变量常驻内存,使用不当会造成内存泄漏

  • 内存泄漏可能会导致应用程序卡顿或崩溃

7、高频闭包面试题

var arr = []for(var i=0;i<3;i++){    arr[i] = function(){        console.log(i)    } }arr[0]()  // 3arr[1]()  // 3arr[2]()  // 3// 这里在执行的时候i已经变成了3// 使用闭包解决var arr = []for(var i=0;i<3;i++){    arr[i] = (function(i){        return function(){            console.log(i)        }     })(i)    }arr[0]()  // 0arr[1]()  // 1arr[2]()  // 2

以上是"Javascript作用域与闭包有什么用"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

作用 函数 闭包 变量 代码 全局 词法 上下 上下文 外层 就是 内存 程序 应用 也就是 位置 内容 区域 只是 只有 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 深圳九邦互联网科技有限公司 奇酷互联网科技公司 新浪科技互联网 镁科技互联网资讯平台 中盈科技互联网信息有限公司 新华互联网科技2019 互联网科技热点资讯 互联网金融科技公司干啥的 开一家科技互联网公司需要多少钱 特约风豹互联网科技为什么扣费 深圳无忧互联网科技 杭州披云加互联网科技有限公司 有人说阿里系是互联网科技企业 云鲸互联网络科技有限公司 互联网领先科技活动 西安左小互联网科技有限公司 唐山双旺合互联网科技产业园 北京瑞云互联网科技有限公司 高科技和互联网的现代国家 互联网科技公司华为 科技和互联网公司 青岛互联网科技公司 安徽鑫晟辉互联网科技 四川狮子座互联网科技 上海电发互联网科技有限公司 互联网大会黑科技排名 科技大学互联网 国大互联网教育科技有限公司薪资 互联网大会出现的黑科技
0