闭包啊闭包,小带作用域

简介: 闭包及其特点

你知道闭包吗?

你知道闭包是什么吗?

你知道闭包作用是什么吗?

你知道闭包有什么缺点吗?

Emmm

可以说是面试经常考的了!


闭包



闭包是引用了自由变量的函数,并且自由变量即便离开了创建环境,也可以和函数一起存在。

这一长串的术语听的一头懵。我的理解就是,闭包就是一个函数,函数里面套函数,子函数调用父函数的变量。


function f1(){
    var a = 10;
    return function(){
        console.log(a)
    }
}
f1()    //输出10


当然,要是真的面试遇到写例子,就要根据实际应用场景啦!比如:点击按钮弹出相应的按钮值。


window.onload = function(){
    var btns = document.querySelectAll('button')
    for(let i = 0; i < btns.length; i++){
        btns[i].onclick = funciton(){
            alert(i + 1)
        }
    }
}
<body>
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button>
</body>


特别注意:一定要是let不能是var哦! var就是常见的闭包逻辑错误(小扯一下,闭包还有一个缺点就是内存无法释放)。

如果不想用let的话,也可以使用自执行匿名函数替换。方法如下:


window.onload = function() {
            var btns = document.querySelectorAll('button')
    for(var i < 0; i < btns.length; i++){
        btns[i].onclick = (function(index){
            return function (index){
                alert(index + 1)
            }
        )(i)
    }
}


特点


闭包函数和自由变量一同存在,即便离开创建环境,也可以和函数一起存在。

闭包的本质是作用域链。

这就要扯到作用域链这个专业术语的概念了。

作用域:变量起作用的范围。

作用域链:当前作用域有变量就用,没有就进入上一级作用域寻找,如果没有继续往上,直到全局作用域为止。 上手一道作用域链题目:


f1( );
a = 1000;
function f1(){
    var a = 100;
    var b = 10;
    function f2(){
        function f3(){
            console.log(a); //undefined
        }
        var c = 200;
        f3();
        var  a = 50;
    }
    f2();
}


这题完全可以用作用域链解释。当前作用域有变量就用,没有就进入上一级作用域寻找。到f2里面,存在一个变量提升,a先定义未赋值,然后执行f3()。所以输出a为undefined。 今天就先总结这些坑,希望看见的童鞋可以避免,我来当你们的填坑人哦。


作者:ClyingDeng

链接:https://juejin.cn/post/6844903946046144525

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
1月前
|
自然语言处理 JavaScript 前端开发
什么是闭包
【10月更文挑战第12天】什么是闭包
|
2月前
|
移动开发
浅谈H5闭包
浅谈H5闭包
|
3月前
|
存储 自然语言处理 JavaScript
闭包
闭包
14 0
|
6月前
|
自然语言处理 JavaScript 前端开发
深入理解作用域、作用域链和闭包
在 JavaScript 中,作用域是指变量在代码中可访问的范围。理解 JavaScript 的作用域和作用域链对于编写高质量的代码至关重要。本文将详细介绍 JavaScript 中的词法作用域、作用域链和闭包的概念,并探讨它们在实际开发中的应用场景。
|
JavaScript 前端开发
对闭包的理解以及使用
对闭包的理解以及使用
49 1
|
存储 缓存 前端开发
详解 Reat 中的闭包问题
JavaScript 中的闭包一定是最可怕的特性之一。 即使是无所不知的 ChatGPT 也会告诉你这一点。 它也可能是最隐秘的语言概念之一。 每次编写任何 React 代码时,我们都会用到它,大多数时候我们甚至没有意识到。 但最终还是无法摆脱它们:如果我们想编写复杂且高性能的 React 应用程序,我们就必须了解闭包。
103 0
详解 Reat 中的闭包问题
|
存储 JavaScript 前端开发
从执行上下文和作用域链理解闭包
从执行上下文和作用域链理解闭包
105 0
从执行上下文和作用域链理解闭包
|
设计模式 自然语言处理 JavaScript
一篇文章帮你真正理解javascsript作用域闭包
一篇文章帮你真正理解javascsript作用域闭包
90 0
|
存储 JavaScript 前端开发
深入理解作用域和闭包(上)
深入理解作用域和闭包(上)
深入理解作用域和闭包(上)
|
存储 缓存 JavaScript
深入理解作用域和闭包(下)
深入理解作用域和闭包(下)
深入理解作用域和闭包(下)