闭包

python函数嵌套

徘徊边缘 提交于 2019-12-22 04:54:10
1. 函数嵌套:    在一个函数中定义了另外一个函数 def outer():   def inner():     print('inner')   print('outer')   inner() outer() inner() # 此句会出错 函数有可见范围,这就是作用域的概念 内部函数不能被外部直接使用,会抛NameError异常 2. 作用域 一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域 全局作用域(global):在整个程序运行环境中都可见 局部作用域:在函数、类等内部可见;局部变量使用范围不能超过其所在的局部作用域 def fn1():   x = 1 # 局部作用域,在fn1内可见 def fn2():   print(x) # x可见吗? print(x) # x可见吗? global使用原则:   外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的是为了封装,尽量与外界隔离。   如果函数需要使用外部全局变量,请使用函数的形参传参解决。   一句话:不用global,学习它就是为了深入理解变量作用域。 3. 闭包 自由变量 :未在本地作用域中定义的变量。例如定义在内存函数外的外层函数的作用域中的变量。 闭包 :出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就行成了闭包

以python为例讲解闭包机制

99封情书 提交于 2019-12-21 09:00:42
以python为例讲解闭包机制 缘起 在学习JS的过程中,总是无可避免的接触到闭包机制,尤其是接触到react后,其函数式的编程思想更是将闭包发扬光大,作为函数式编程的重要语法结构,python自然也拥有闭包这一语法结构。 在这篇文章中我会介绍如何产生一个闭包函数,闭包函数产生的原因和使用它的优点。 回顾python的函数作用域 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。 我们从最简单的嵌套函数来了解闭包 def transmit_to_space(message): def data_transmitter(): "这是一个嵌套函数" print(message) data_transmitter() print(transmit_to_space("Test message")) 我们可以发现,嵌套在外层函数transmit_to_space里的data_transmitter访问了外层函数提供的形参message。我们可以得知,局部作用域能够访问外部作用域。 def print_msg(number): def printer(): "Here we are using the

js 原型链,继承,闭包,内存,泄露

こ雲淡風輕ζ 提交于 2019-12-21 01:55:33
var A = function(){ this.name="xiaoming"; } A.prototype.age=9; var a = new A(); console.log(a.age); //9 图中长方形代表实例对象a,圆形代表原型,三角形代表构造函数。由图可知: a.__proto__ === A.prototype; //true A.prototype.constructor===A; //true A.prototype.__proto__===Object.prototype; //true Object.prototype.__proto__===null; //true 复制代码 实例和原型之间是通过__proto__属性连接,且是单向的,从实例指向原型;原型和构造函数之间连接是双向的,通过constructor和prototype连接,具体见图;原型链上的属性是所有实例共享的,看下面的例子: var A = function(){ this.name="xiaoming"; } var a = new A(); A.prototype.age=9; var b = new A(); console.log(a.age); //9 console.log(b.age); //9 复制代码 a、b都可以访问A原型链上的属性age。

浅谈JS的作用域链(二)

ε祈祈猫儿з 提交于 2019-12-21 01:44:21
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现。 本文就看看Execution Context中的scope chain。 作用域 开始介绍作用域链之前,先看看JavaScript中的作用域(scope)。在很多语言中(C++,C#,Java),作用域都是通过代码块(由{}包起来的代码)来决定的, 但是,在JavaScript作用域是跟函数相关的,也可以说成是function-based。 例如,当for循环这个代码块结束后,依然可以访问变量"i"。 1 2 3 4 5 for (var i = 0 ; i < 3 ; i++){ console.log(i); } console.log(i); //3 对于作用域,又可以分为全局作用域(Global scope)和局部作用域(Local scpoe)。 全局作用域 中的对象可以在代码的任何地方访问,一般来说,下面情况的对象会在全局作用域中: 最外层函数和在最外层函数外面定义的变量 没有通过关键字"var"声明的变量 浏览器中,window对象的属性 局部作用域 又被称为函数作用域(Function scope),所有的变量和函数只能在作用域内部使用。 1 2 3 4 5 6 7 8 9 var

理解Ruby的4种闭包:blocks, Procs, lambdas 和 Methods。

旧街凉风 提交于 2019-12-20 19:41:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> blocks, Procs, Methods, lambdas(也称闭包)是Ruby中最强大的一部分,用过你就会知道,同时也是最容易迷惑的。 这可能是因为Ruby处理闭包的方式有点怪。更甚的是,Ruby有4种处理闭包的方式, 第一次用,每种都不太顺手。 首先:blocks代码块 最常见、最简单、最富争议、最有Ruby风格的方式是blocks。写法如下: array = [1, 2, 3, 4] array.collect! do |n| n ** 2 end puts array.inspect # => [1, 4, 9, 16] do…end构成一个block。然后把这个block通过collect!传给一个数组。就可以使用block中的n来迭代数组中每个元素。 collect!是Ruby库里的方法,下面我们来写一个自己的类似方法iterate! class Array def iterate! self.each_with_index do |n, i| self[i] = yield(n) end end end array = [1, 2, 3, 4] array.iterate! do |n| n ** 2 end puts array.inspect # => [1, 4, 9, 16] 首先

常见的 JavaScript 内存泄露

点点圈 提交于 2019-12-20 18:12:16
内存泄漏:由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。 1、意外的全局变量 js对未声明变量会在全局最高对象上创建它的引用,(是以属性存在的,而不是变量),如果在游览器上就是window对象,如果在node环境下就是global;如果未声明的变量缓存大量的数据,它可能只有在页面被刷新或者被关闭的时候才会释放内存,这样就造成了内存意外泄漏。如下例子: function my() { name="my name is tokey" } my() console.log(window) 在控制台可以看到 还有通过this创建意外的全局变量 function my() { this.name="my name is tokey" } my() console.log(window.name)  //my name is tokey 此时的this指向的并不是undefined而是全局对象window 针对上面类型的内存泄漏我们在平时一定要声明变量,不要有全局直接引用。(在JavaScript文件中添加 'use strict' ,开启严格模式,可以有效地避免上述问题。) 2、console.log 作为前端平时使用console

Python函数的作用域规则和闭包

穿精又带淫゛_ 提交于 2019-12-20 03:40:13
作用域规则 命名空间是从名称到对象的映射, Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器退出。 内置命名实际上存在于一个叫__builtins__的模块中,可以通过globals()['__builtins__'].__dict__查看其中的内置函数和内置异常。 全局命名空间,在 读入函数所在的模块时创建, 通常情况下,模块命名空间也会一直保存到解释器退出。可以通过内置函数globals()查看。 局部命名空间,在函数调用时创建,其中包含函数参数的名称和函数体内赋值的变量名称。 在函数返回或者引发了一个函数内部没有处理的异常时删除, 每个递归调用有它们自己的局部命名空间。可以通过内置函数locals()查看。 python解析变量名的时候, 首先搜索局部命名空间。如果没有找到匹配的名称,它就会搜索全局命名空间。如果解释器在全局命名空间中也找不到匹配值,最终会检查内置命名空间。如果仍然找不到,就会引发NameError异常。 不同命名空间内的名称绝对没有任何关系,比如: a = 42 def foo(): a = 13 print "globals: %s" % globals() print "locals: %s" % locals() return a foo()

深入浅出JavaScript之闭包(Closure)

蹲街弑〆低调 提交于 2019-12-19 06:35:42
闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面写下我的学习笔记~ 闭包-无处不在 在前端编程中,使用闭包是非常常见的,我们经常有意无意,直接或间接用到了闭包。闭包可以使传递数据更加灵活(比如处理一些点击事件) !function() { var localData = "localData here"; document.addEventListener('click', //处理点击事件时用到了外部局部变量,比如这里的localData function(){ console.log(localData); }); }(); 又比如下面这个例子:(是不是很亲切~~) !function() { var localData = "localData here"; var url = "http://www.baidu.com/"; $.ajax({ url : url, success : function() { // do sth... console.log(localData); } }); }(); 再来看一个例子~~这种情况就是我们通常所说的闭包 function outer() { var localVal = 30; return

闭包(closure)

允我心安 提交于 2019-12-19 06:35:23
大牛的讲解, 点击   我们首先需要有作用域的概念, 点击    那么什么是闭包? 官方的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 广义上的闭包就是指一个变量在它自身作用域的被使用了,就叫发生了闭包。粗鲁地理解:闭包就是能够读取其它函数内部变量的函数。 在js中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单粗暴地理解成“定义在一个函数内部的函数”,即一个函数嵌套了另一个函数。 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性: 作用域链,垃圾(内存)回收机制,函数嵌套......   由于作用域的关系,我们在函数外部是无法直接访问到函数内部的变量的,但是函数内部可以把这个变量传给全局变量或者返回出来,这样外部作用域就可以访问函数内部作用域的变量了;   简单的说,闭包就是有权限访问另一个函数内部作用域的变量的函数; javascript具有自动垃圾回收机制,函数运行完之后,其内部的变量和数据会被销毁; 但是闭包就是在外部可以访问此函数内部作用域的变量,所以闭包的一个特点就是 script type ="text/javascript" > function outer(){ var a = 1 ; function inner(){ return a ++ ; }

深入理解JavaScript闭包(closure)

无人久伴 提交于 2019-12-19 06:34:54
网上不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业。对于初学者来说别说理解闭包了,就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目。 一、什么是闭包? “官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 相信很少有人能直接看懂这句话,因为他描述的太学术。其实这句话通俗的来说就是: JavaScript中所有的function都是一个闭包 。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。看下面这段代码: function a() { var i = 0; function b() { alert(++i); } return b; } var c = a(); c(); 这段代码有两个特点: 函数b嵌套在函数a内部; 函数a返回函数b。 引用关系如图: 这样在执行完var c=a()后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说: 当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。