函数式编程,闭包,作用域,全局变量

 function generateClosure(){
  var count = 0;

  var get = function(){
   return ++count;
 }

  return get;
}

var counter = generateClosure();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

一个函数返回它内部定义的一个函数,就产生了一个闭包,闭包不仅包括被返回的函数 ,还包括这个函数的定义环境。上面例子中,generateClosure内部的函数get被外部的变量counter引用时,counter和generateClosure的局部变量就构成了一个闭包。

 
function generateClosure(){
  var count = 0;

  var get = function(){
   return ++count;
 }

  return get;
}

var counter1 = generateClosure();
var counter2 = generateClosure();
console.log(counter1()); // 1
console.log(counter2()); // 1
console.log(counter1()); // 2
console.log(counter1()); // 3
console.log(counter2()); // 2

上面例子generateClosure调用了两次,产生了两个独立的闭包实例,二者的定义环境不一样。可以这样理解,generateClosure返回get的时候,也将get能引用到的generateClosure的局部变量也返回了,并在内存中生成了一个副本。上面的例子即使把var换成let,值类型count换成对象count{value:0}必不会影响结果。

时间: 2024-10-23 01:36:35

函数式编程,闭包,作用域,全局变量的相关文章

20170917 前端开发周报:JavaScript函数式编程、作用域和闭包

1.用函数式编程对JavaScript进行断舍离 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! https://juejin.im/entry/59b86... 2.JavaScript作用域和闭包 作用域和闭包在JavaScript里非常重要.但是在我最初学习JavaScript的时候,却很难理解.这篇文章会用一些例子帮你理解它们.我们先从作用域开始.作用域 JavaScript的作用域限定了你可以访问哪些变量.有两种作

javascript里的偏函数——本质函数式编程+闭包,返回函数

除非你已经使用过其他的函数式编程,不然你可能对下面这两个概念很陌生:"偏函数应用"和"函数柯里化". 偏函数应用,英文是partial application,也可以译作"局部应用"."部分应用"."偏应用" 函数柯里化,英文是currying,也可以译作"局部套用"."加里化"."卡瑞化" 话虽如此,但是假如你一旦理解了这两个概念,你就完全可以在

Golang-函数式编程(闭包)

github:https://github.com/ZhangzheBJUT/blog/blob/master/closure.md 一 函数式编程概论 在过去近十年时间里,面向对象编程大行其道,以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象.孰不知,在面向对象思想产生之前,函数式编程已经有了数十年的历史.就让我们回顾这个古老又现代的编程模型,看看究竟是什么魔力将这个概念在21世纪的今天再次拉入我们的视野. 随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能

JavaScript闭包其一:闭包概论 函数式编程中一些基本定义

http://www.nowamagic.net/librarys/veda/detail/1707前面介绍了作用域链和变量对象,现在再讲闭包就容易理解了.闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的. 在直接讨论ECMAScript闭包之前,还是有必要来看一下函数式编程中一些基本定义. 众所周知,在函数式语言中(ECMAScript也支持这种风格),函数即是数据.就比方说,函数可以赋值给变量,可以当参数传递给其他

Python函数式编程之闭包

-------------------------函数式编程之*******闭包------------------------ Note: 一:简介 函数式编程不是程序必须要的,但是对于简化程序有很重要的作用. Python中一切都是对象,函数也是对象 a = 1 a = 'str' a = func 二:闭包 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+环境变量) 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用, 那么内部函数就被认为是闭包(clo

javaScript函数式编程-包含闭包、链式优化及柯里化

本文着重介绍个人理解的函数式编程. 函数式编程个人理解为:以函数为主要载体的编程方式. 好处: 语义更加清晰 可复用性高 可维护性好 作用域局限.副作用少 基本函数式编程: //实现数组中每个单词首字母大写 //一般写法 const arr = ['apple','orange','pear']; for(const i in arr) { const c = arr[i][0]; arr[i] = c.toUpperCase() + arr[i].slice(1); //slice()从已有的

函数式编程--函数和闭包

函数式编程就是一种抽象程度很高的编程范式.(Python允许使用变量,不是纯函数式编程语言) 函数式编程的特点:函数可以赋给变量,所以,可作为参数传递,可作为返回值返回. 一个最简单的高阶函数: 1 def add(x, y, f): 2 return f(x) + f(y) add(-5, 6, abs) , abs 作为参数传入 add 函数中 ,又作为参数返回 作为参数 一个列表运算的例子:lst = range(5) 加法:只需 for 循环遍历 lst ,依次相加,返回 amout 1

python之函数式编程与函数闭包

防伪码:忘情公子著 Python函数式编程: 函数式编程: 也称作泛函编程,是一种编程范型,说白了就是实现可以把函数当参数传递给另一个函数: 它将电脑运算视为数学上的函数计算,并且避免状态以及可变数据: 函数式编程语言最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出 Python支持有限的函数式编程功能: filter(func,seq): 调用一个布尔函数func来迭代遍历每个seq中的元素:返回一个使func返回值为true的元素的序列 In [1]: d

站在C#和JS的角度细谈函数式编程与闭包

1.函数式编程是什么? 摘自百度的说法是.函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus).而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值).和指令式编程相比,函数式编程强调函数的计算比指令的执行重要.和过程化编程相比,函数式编程里,函数的计算可随时调用. 举个例子.平时如果我们要对集合中的元素进行筛选的话,每次都要写循环,都写这么一大堆代码,麻烦不? static void Main(string[] arg

(转) 站在C#和JS的角度细谈函数式编程与闭包

1.函数式编程是什么? 摘自百度的说法是.函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus).而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值).和指令式编程相比,函数式编程强调函数的计算比指令的执行重要.和过程化编程相比,函数式编程里,函数的计算可随时调用. 举个例子.平时如果我们要对集合中的元素进行筛选的话,每次都要写循环,都写这么一大堆代码,麻烦不? static void Main(string[] arg