文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Javascript作用域与闭包详情

2024-04-02 19:55

关注

1、作用域

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

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

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


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

解析:

所以最终会打印出 NaN,100

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

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


// ES5
if(true) {
  var name = '南玖'
}
console.log(name)  // 南玖

// ES6
if(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对闭包的定义:

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


let scope = 'global scope'
function checkscope(){
  let scope = 'local scope'
  function f(){
    return scope
  }
  return f
}

let s = checkscope()   
s()   // 这里返回什么?

很多同学可能觉得是global 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]()  // 3
arr[1]()  // 3
arr[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]()  // 0
arr[1]()  // 1
arr[2]()  // 2

到此这篇关于Javascript作用域与闭包详情的文章就介绍到这了,更多相关Javascript作用域与闭包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯