-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
面试官:说说你对闭包的理解?闭包使用场景 #57
Comments
使用闭包模拟私有方法 |
function init() { 这里应该是基于词法作用域 使得alert可以获取到init函数的变量,不是由于闭包的特性,它可以访问到外部函数的变量 |
function makeCounter() {
|
一、是什么
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)
也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域
在
JavaScript
中,每当创建一个函数,闭包就会在函数创建的同时被创建出来,作为函数内部与外部连接起来的一座桥梁下面给出一个简单的例子
displayName()
没有自己的局部变量。然而,由于闭包的特性,它可以访问到外部函数的变量二、使用场景
任何闭包的使用场景都离不开这两点:
下面举个例子:
在页面上添加一些可以调整字号的按钮
柯里化函数
柯里化的目的在于避免频繁调用具有相同参数函数的同时,又能够轻松的重用
使用闭包模拟私有方法
在
JavaScript
中,没有支持声明私有变量,但我们可以使用闭包来模拟私有方法下面举个例子:
上述通过使用闭包来定义公共函数,并令其可以访问私有函数和变量,这种方式也叫模块方式
两个计数器
Counter1
和Counter2
是维护它们各自的独立性的,每次调用其中一个计数器时,通过改变这个变量的值,会改变这个闭包的词法环境,不会影响另一个闭包中的变量其他
例如计数器、延迟调用、回调等闭包的应用,其核心思想还是创建私有变量和延长变量的生命周期
三、注意事项
如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响
例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。
原因在于每个对象的创建,方法都会被重新赋值
上面的代码中,我们并没有利用到闭包的好处,因此可以避免使用闭包。修改成如下:
The text was updated successfully, but these errors were encountered: