一个人的价值,应该看他贡献什么,而不应当看他取得什么。 ——<阿尔伯特·爱因斯坦>
作者:Ashish Lahoti
译者:cl9000
来源:https://codingnconcepts.com/javascript/lexical-scope-closures-and-currying/#closures
这篇文章描述了JavaScript中的 Lexical Scope
, Closures
和 Currying
函数以及它们之间的关系。
词法范围 Lexical Scope
使用var
关键字定义的变量具有函数作用域,这意味着每次创建一个新函数时都会创建一个新的作用域。
词法作用域
与函数作用域
相关联。变量的词法作用域是由它们在源代码中的位置定义的。JavaScript
从最内部的作用域开始解析变量,并向外搜索,直到找到它要寻找的变量。
1 | var me = "global"; |
外部变量me
的值是全局的,而如果从外部执行函数whoami()
,则值为 local
.
闭包 Closures
闭包是一个非常重要的概念,在JavaScript
的采访中经常被问到。
闭包是一个内部函数,可以访问它的外部函数作用域以及以上所有作用域,即使这个函数在它的外部函数之外执行。
当你在外部函数中定义一个内部函数时,闭包会在运行时为内部函数和外部函数的作用域创建。
让我们看一个例子来理解闭包
1 | var outerFunc = function(c){ |
1 | **Output** |
我们有三个控制台目录/日志。让我们逐一讨论一下:
innerFunc
有一个在outerFunc
中定义或传递作为参数的变量闭包
1 | 0: Closure (outerFunc) {c: 3, a: 1} |
innerMostFunc
有一个在outerFunc
和innerFunc
中定义或传递作为参数的变量闭包。
1 | 0: Closure (innerFunc) {d: 4, b: 2} |
innerMostFunc
返回a+b+c+d+e=15
其中a
和c
的值来自Closure (outerFunc)
b
和d
的值来自Closure (innerFunc)
e
的值来自所传递的参数
他们的方式我们称为outerFunc(3)(4)(5)
也称为currying
柯里化 Currying
闭包的一个用例是 Currying函数
。
Currying函数
是这样一种函数,在这种函数中,你将一个函数分解为一次接受多个参数,而不是一次接受所有参数。
1 | f(a, b, c) => Currying => f(a)(b)(c) |
我们来转换这个函数
1 | var add = function(a, b, c){ |
转成 Curryings函数
1 | var add = function(a){ |
一个例子:-
1 | var sayWhat = function(a){ |
Output
say hello to friends using currying function
在Curryings函数
中,每个嵌套函数都在它们的闭包中跟踪外部函数传递的参数.
参考
- 原文 - https://codingnconcepts.com/javascript/lexical-scope-closures-and-currying/#closures
- MDN 闭包- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
关注【公众号】,了解更多。
关注【公众号】,了解更多。
关注【公众号】,了解更多。
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!