博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包是什么?
阅读量:4595 次
发布时间:2019-06-09

本文共 1768 字,大约阅读时间需要 5 分钟。

原文链接:

老姚说:

产生闭包的三个条件:

  1. 调用的函数是父级作用域内部声明的
  2. 调用的函数是在父级作用域之外进行调用
  3. 调用的函数内部使用了父级作用域的内部变量

    闭包举例

    1.作为函数返回结构的一部分

var fun = function() {        var x = 0;        return {                fn: function() {                        alert(++x);                }         };        }var r = fun();r.fn();r.fn();

r.fn是fun的内部函数(注意函数是引用类型的),调用是在fun的外部调用的。

2.赋给外部变量

var fun1;var fun2 = function() {        var x = 0;        fun1 = function() {                alert(x);        }        }fun2();fun1();

其中fun1是个闭包,条件都满足。有疑问的地方可能是,是否内部声明的呢?是的,因为fun1是个函数,是fun2的内部函数。

3.异步操作,绑定到dom事件

var fun2 = function() {        var btn = document.querySelector("#myBtn");        var x;        btn.onclick = function() {                alert(x);        }        }fun2();

主要看看是否是外部调用。是的。因为用户点击时触发事件,不是在fun2中内部调用的。

如果btn是外部声明的,跟情况2差不多。

4.异步操作,setTimeout或setInterval

var fun = function(x) {        setInterval(function() {                console.log(x++);        }, 3000)        }fun(1);

setInterval第一个参数,是一个函数,此函数的执行必须是在全局调用的。因此是闭包。

5.异步操作,ajax请求回调

6.特权函数

var Person = function() {        this.sayName = function() {                alert(name);        }        var name = "laoyao";        }var p = new Person();p.sayName();

上面我故意把sayName和name写反的,没有问题的。

只要是闭包,使用的外部变量位置“在哪”都可以的。当然闭包不是本质原因,只要在函数调用之前就行了。而闭包是在外部调用的。
这里来说说它为啥是闭包呢?
p.sayName是个构造函数内部声明的匿名函数,没问题。
调用时也是在构造函数之外调用。

写到这里,回想当初写的第一篇文章说闭包是一个函数的返回值,并引用了函数内部变量。现在看来还是太年轻。让怨念先飞一会儿。

最后,再来一个更深层的例子。

var fun1 = function() {        var x = 1;        return function fun2() {                var y = 5;                return function fun3() {                        alert("x=" + (++x) +";y=" +(++y));                }        }        }var fun2 = fun1();var fun3 = fun2();fun3();fun3();

fun2和fun3都是闭包。如果结合上面的几种情况,类似的例子能写出很多。

转载于:https://www.cnblogs.com/bluey/p/6417775.html

你可能感兴趣的文章
Hero In Maze(BFS广搜)
查看>>
操作列表
查看>>
iOS开发之Runtime使用
查看>>
导入maven项目时出现 Version of Spring Facet could not be detected. 解决方法
查看>>
nginx https ssl 设置受信任证书[原创]
查看>>
第二个项目:WC
查看>>
PowerMock注解PowerMockIgnore的使用方法
查看>>
ASP基础之内置类型及注意点
查看>>
设计模式10-装饰模式
查看>>
Beta冲刺Day4
查看>>
Android中intent启动Activity中intent.setFlags()的作用
查看>>
配置spring事务管理的几种方式(声明式事务)
查看>>
IO-2
查看>>
SQL中获取自增长的最大ID
查看>>
Kotlin对象:仅一行代码就可创建安全的单例
查看>>
HDU 1556 区间查询
查看>>
ecshop缓存清理-限制或禁用ECShop缓存
查看>>
JS 正则匹配字符串
查看>>
Safe Area Layout Guide before iOS 9.0
查看>>
Machine learning - Introduction to Gaussian processes 学习记录
查看>>