JS闭包极简

作者: 六个周 | 来源:发表于2018-12-16 17:00 被阅读4次
1、先来看一个闭包的代码小例子:
var scope = "全局scope"; 
function checkScope() {
var scope = "内部scope";
function f() {
    return scope;
}
return f();
}
checkScope();   //=> "内部scope"

闭包可以捕获到局部变量和参数的外部函数绑定,即便外部函数的调用已经结束。
词法作用域的规则,即函数被执行时(executed)使用的作用域链(scope chain)是被定义时的scope chain,而不是执行时的scope chain,就可以很容易的理解闭包的行为了。

2、在javascript语言中,闭包就是函数和该函数作用域的组合。从这个概念上来讲,在js中,所有函数都是闭包(函数都是对象并且函数都有和他们相关联的作用域链scope chain)。简单说:闭包就是有权访问另一个函数作用域中变量的函数.
3、在ES6之前,函数只能在全局作用域和函数作用域中声明,不能在块级作用域中声明。没有块级作用域导致很多场景不合理,闭包在一些地方很好解决了这个不合理。
4.闭包的使用场景

场景描述:假如页面上有5个button,要给button绑定onclick事件,点击的时候,弹出对应button的索引编号。

#html
<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
</head>
<body>
<button>Button0</button>
<button>Button1</button>
<button>Button2</button>
<button>Button3</button>
<button>Button4</button>
</body>
</html>
#js
...
var btns = document.getElementsByTagName('button');
for(var i = 0, len = btns.length; i < len; i++) {
btns[i].onclick = function() {
    console.log(i);
}
}
...

通过执行该段代码,发现不论点击哪个button ,均输入4;
这显然不符合我们的需求,我们我们需要修改代码:
1️⃣ 将for循环中的var 变为let
2️⃣Tip: 在ES6之前,没有块级作用域 ,只有函数作用域(即:通过var声明的变量没有块级作用域)。可以采用“立即执行函数”的方式创建作用域。

for(var i = 0, len = btns.length; i < len; i++) {
(function(i) {
    btns[i].onclick = function() {
       console.log(i);
    }
}(i))
}
5、闭包注意点

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

相关文章

  • JS闭包极简

    1、先来看一个闭包的代码小例子: 闭包可以捕获到局部变量和参数的外部函数绑定,即便外部函数的调用已经结束。词法作用...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • 《Groovy极简教程》第9章 Groovy闭包(Closure

    《Groovy极简教程》第9章 Groovy闭包(Closures)

  • JS闭包

    JS闭包 闭包练习

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • 简单的聊一下闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

网友评论

    本文标题:JS闭包极简

    本文链接:https://www.haomeiwen.com/subject/aikxkqtx.html