作用域

Python命名空间和作用域

拈花ヽ惹草 提交于 2020-02-12 17:53:26
Python命名空间和作用域: 变量拥有匹配对象的名字,命名空间包含了变量的名称(键)和所指向的对象(值)。 Python表达式可以访问局部命名空间和全局命名空间 注:当局部变量和全局变量重名时,使用的是局部变量 每个函数和类都具有自己的命名空间,称为局部命名空间 如果需要在函数中使用全局变量,可以使用 global 关键字声明,声明后,Python会将该关键字看作是全局变量 # global 全局变量名: # 在函数中使用全局变量,可以对全局变量进行修改。 # 注:如果只是在函数中使用了和全局变量相同的名字,则只是局部变量 # 定义全局变量 total total = 0 def add(num1,num2): # 使用 global 关键字声明全局变量 total global total total = num1 + num2 # 输出全局变量 print(total) add(4,6) # 10 # 输出全局变量 print(total) # 10 2020-02-12 来源: https://www.cnblogs.com/hany-postq473111315/p/12299536.html

JavaScript之闭包(重新认识)

我是研究僧i 提交于 2020-02-12 04:24:38
最近又重新学习了闭包,发现之前没有深刻理解作用域链,学习作用域链后对闭包才可以做到真正的理解。 闭包 是指有权另一个函数作用域中变量的函数。要理解闭包首先理解作用域链。 执行环境 定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有与之关联的变量对象,保存了环境中定义的所有变量和函数。只有解析器在处理数据是我才可以访问这个变量。当代码在一个环境中执行时,会创建变量对象的一个 作用域链 ,它保证了执行环境对有权访问的变量和函数的有序访问。 当某个函数被调用时,会创建一个执行环境及相应的作用域链。作用域的最前端,始终都是当前执行代码所在环境的变量对象,下一个变量对象来自外部环境,以此类推,直到全局作用域中的变量对象作为作用域链的终点。作用域链中一定不会包含其内部子函数的变量对象,但子函数的作用域链包含函数的局部变量,因此这决定 创建闭包的方法 是在一个函数内部创建另一个函数,内部函数可以引用外部函数的变量。 闭包与变量 闭包只能取得函数中任何变量的最后一个值,如下创建一个数组函数 function creatFunction(){ var result = new Array(); for (var i=0; i<10; i++){ result[i] = function(){ return i; }; } return result; }

Javascript闭包

扶醉桌前 提交于 2020-02-12 03:51:41
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 Js代码    var n=999;   function f1(){     alert(n);   }   f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量。 Js代码    function f1(){     var n=999;   }   alert(n); // error 这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! Js代码    function f1(){     n=999;   }   f1();   alert(n); // 999 -------------------------------------------------------------------------------------------------------- 二、如何从外部读取局部变量? 出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下

深入理解javascript闭包

为君一笑 提交于 2020-02-12 03:09:45
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 Js代码 var n=999;   function f1(){     alert(n);   }   f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量。 Js代码   function f1(){     var n=999;   }   alert(n); // error 这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! Js代码   function f1(){     n=999;   }   f1();   alert(n); // 999 -------------------------------------------------------------------------------------------------------- 二、如何从外部读取局部变量? 出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的

深入理解JavaScript闭包(closure)

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

深入理解JavaScript闭包(closure)

时光怂恿深爱的人放手 提交于 2020-02-12 00:21:09
最近在网上查阅了不少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外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。

什么是闭包?

梦想的初衷 提交于 2020-02-12 00:17:52
一、什么是闭包? 闭包就是能够读取其他函数内部变量的函数,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。 函数的嵌套形成闭包,闭包包括函数本身以及它的外部作用域。使用闭包可以形成独立的控件,延长变量的生命周期,保存中间状态值。 js语言中,函数内部可以直接读取函数外部的全局变量,而函数外部却无法读取函数内部的变量。 那么如何获取函数内部的变量呢,那就是在函数内部,在定义一个函数,这个函数可以拿到它上一级函数的变量,接着把这个函数当成返回值返回,就可以拿到定义在函数内部的变量 简单的说,作用域是针对变量的,比如我们创建一个函数 a1 ,函数里面又包了一 个子函数 a2 。此时就存在三个作用域: 全局作用域、 a1 作用域、 a2 作用域;即全局作用域包含了 a1 的作用域, a2 的作用 域包含了 a1 的作用域。 当 a1 在查找变量的时候会先从自身的作用域区查找,找不到再到上一级 a2 的作用域 查找,如果还没找到就到全局作用域区查找,这样就形成了一个作用域链。 理解闭包首先要理解, js 垃圾回收机制,也就是当一个函数被执行完后,其作用域会被 收回,如果形成了闭包,执行完后其作用域就不会被收回。 如果某个函数被他的父函数之外的一个变量引用,就会形成闭包。 闭包的作用,就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部 不能直接访问该变量。

简单详细讲解js闭包(转载)

不问归期 提交于 2020-02-11 21:03:16
闭包,其实是一种语言特性,它是指的是程序设计语言中,允许将函数看作对象,然后能像在对象中的操作般在函数中定义实例(局部)变量,而这些变量能在函数中保存到函数的实例对象销毁为止,其它代码块能通过某种方式获取这些实例(局部)变量的值并进行应用扩展。 我们的理解: 其实闭包就是一个函数,一个外部函数通过调用函数并return返回出内部函数,这里的内部函数就是一个闭包;此时在内部函数中是可以访问到外部函数的变量的; 要想理解闭包,首先我们要了解栈堆内存和作用域链;首先我们来讲解栈堆内存: 首先我们来看个demo: var a=1; var obj={"name":"咸鱼"} 上面简单的两句代码,其实就是在内存中做了两件事,效果图如下: 在js简单实现深浅拷贝(https://www.cnblogs.com/dengyao-blogs/p/11466598.html)一文中我们知道基本数据类型是存储在栈内存中的,引用数据类型是存储在堆内存中的,其实上面的两句代码在内存中就是做了两件事: 1.首先在栈内存中开辟了一块空间用来存放a的变量和值; 2.在堆内存中开辟了一块空间用来存储obj的值,同时在将地址指向栈内存中的变量名obj 如果我们在代码下面再加上一句obj={"name":'张三"},这个时候我们之前存储name为咸鱼的值也就是obj原来的值会被js中的垃圾回收机制回收掉

浅析 JavaScript 中的闭包(Closures)

两盒软妹~` 提交于 2020-02-11 05:10:07
/*--> */ /*--> */ 一、前言 对于 JavaScript 来说,闭包是一个非常强大的特征。但对于刚开始接触的初学者来说它又似乎是特别高深的。今天我们一起来揭开闭包的神秘面纱。闭包这一块也有很多的文章介绍过了,今天我就浅谈一下自己对闭包的的一些理解,希望能提供一点鄙陋的见解帮助到正在学习的朋友。该文章中能使用口语化的我将尽量使用口语化的叙述方式,希望能让读者更好理解,毕竟文章写出来宗旨就是要让人读懂。文章难免有不足之处还希望帮忙指出。 二、Javascript 的作用域链 在了解闭包之前,我们先来看看几个准备知识。 变量的作用域 首先,什么是作用域?域,区域。简单来理解就是一个变量能被访问的范围(区域)。换言之就是这个变量能起作用的区域。按这个标准来划分我们将变量分为 全局变量 和 局部变量 两种 以定义的方式来区分有以下特点: 定义在函数内部的变量是局部变量,定义在函数外部的变量是全局变量。(这个并不只是 Javascript 语言的特点)局部变量在函数内部能被访问,在函数外部不能被直接访问,所以局部变量就是从定义它的地方开始到函数结束的位置结束。当然这里有个细节-- 变量声明提升 。等下我们用一小段代码提一下变量声明提升是什么。我们先来看看局部变量和全局变量的代码 var a = 0; function testFunc(){ var b = 1; console

深入理解JavaScript系列(14):作用域链(Scope Chain)

给你一囗甜甜゛ 提交于 2020-02-11 04:55:43
前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量、函数声明和函数的形参)作为属性存储在变量对象中。 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出现在代码执行阶段。 这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题——作用域链。 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/中文参考:http://www.denisdeng.com/?p=908本文绝大部分内容来自上述地址,仅做少许修改,感谢作者 定义 如果要简要的描述并展示其重点,那么作用域链大多数与内部函数相关。 我们知道,ECMAScript 允许创建内部函数,我们甚至能从父函数中返回这些函数。 var x = 10; function foo() { var y = 20; function bar() { alert(x + y); } return bar; } foo()(); // 30 这样,很明显每个上下文拥有自己的变量对象:对于全局上下文,它是全局对象自身;对于函数,它是活动对象。 作用域链正是内部上下文所有变量对象(包括父变量对象)的列表。此链用来变量查询。即在上面的例子中,“bar”上下文的作用域链包括AO(bar)、AO(foo)和VO