作用域

标识符的作用域

≯℡__Kan透↙ 提交于 2019-11-30 14:33:56
标识符的作用域 “作用域是一个标识符在程序正文中有效的区域”——来自教材《C++语言程序设计》 一、函数原型作用域 “在函数原型声明时形式参数的作用范围就是函数原型作用域。” 函数的形参的标识符只在这个函数中有效,另外,函数中的声明的变量的标识符也只在该函数中生效。当在函数以外的地方使用这些标识符时(如果在这些地方没有声明过这些变量),编译器就会报错。 实验1:在函数内声明一些变量,在函数外使用,然后观察编译器的反应,以及如何解决。 要在这些地方使用相同的标识符时,就需要再次对这些标识符进行声明。 对主函数中标识符进行重新声明后,运行成功: 二、局部作用域(块作用域) 在块里面声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止。 实验2:在块外面声明变量,然后再在块里面声明同样标识符的变量,并分别在块内和块外使用cout语句将变量的值输出到屏幕,查看结果,并尝试去查找原因。 #define _CRT_SECURE_NOWARNINGS #include<iostream> using namespace std; int main() { int flag=1; int i = 2; int j = 3; if (1) { int flag = 78; cout << "块内flag=" << flag << endl; if (1) { int i = 28;

函数与变量作用域

試著忘記壹切 提交于 2019-11-30 13:36:58
  全局变量 与 局部变量 与 闭包变量(介于两者之间的变量)   global关键字:局部范围内更改全局变量(函数默认只能读取全局变量,不能修改)   nonlocal关键字:嵌套函数中修改闭包变量(外层函数定义的变量相当于其语句块内的全局变量)    1 i=1 2 j=2 3 print('全局变量:i=',i,'j=',j) 4 5 def fun(): 6 global i,j #要想修改全局变量,需要先使用global关键字对其进行事先声明 7 i=2 8 j=3 9 10 fun() 11 print('调用fun,修改后的全局变量:i=',i,',j=',j) 12 13 14 def fun1(): 15 i=0 16 print('i='+str(i)+',在fun1中,是局部变量') 17 18 fun1() 19 print('i='+str(i)+',在函数外部,是全局变量') 20 21 22 def fun2(): 23 k=2 #k为闭包变量(Closue),范围介于全局变量和局部变量之间,需要修改时使用nonlocal关键字先声明后修改 24 def fun3(): 25 nonlocal k 26 k = 3 27 a=k+i 28 return a 29 print('fun2中,闭包变量k='+str(k)) 30 return fun3()

二.函数进阶

◇◆丶佛笑我妖孽 提交于 2019-11-30 12:43:39
阅读目录  楔子  命名空间和作用域  函数嵌套及作用域链  函数名的本质  闭包  本章小结 返回顶部 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bigger) 之前是不是我告诉你们要把结果return回来你们就照做了?可是你们有没有想过,我们为什么要把结果返回?如果我们不返回m,直接在程序中打印,行不行? 来看结果: >>> def my_max(x,y): ... m = x if x>y else y ... >>> my_max(10,20) >>> print(m) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'm' is not defined 报错了!错误是“name 'm' is not defined”。变量m没有被定义。。。为啥?我明明定义了呀! 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。 但是

python之函数:二

允我心安 提交于 2019-11-30 12:37:25
本文从以下几个方面入手更多了解python函数: 函数中的变量作用域 函数中的闭包现象 函数中的装饰器 标准库中的装饰器 叠加装饰器 参数化装饰器模式 def A(func):   def B():      return   return B 函数中的LEGB原则:即本地作用域->外部作用域->全局作用域->到此就可以了...       对于函数B而言 B的函数体叫本地作用域,A的函数体叫B的外部作用域,A所在的文件是B的全局作用域       如果需要在B中进行全局变量的修改q请使用global关键字对变量进行申明 函数中的闭包:     对于B的函数体能够调用A作用域下的变量 c的行为称为闭包 标准的定义:非全局作用域下的函数能够记住它被命名的封闭空间(B封闭于A)     其中变量Cc称之为自由变量 :指未在本地作用域中绑定的变量 q其中使用nonlocal去申明自由变量 (如同global)      装饰器:     定义:能够增强函数的行为 在目标函数前执行l另一个函数对目标函数进行修饰     表现:形如ex就是一个装饰器     使用: @A        def target():           pass 参数化装饰器:都知道装饰器接受目标函数的函数名作为参数进行传递,那么如果被装饰的目标函数带有参数怎么办?        在装饰器外面在嵌套一层函数

什么是闭包?闭包的优缺点?

你说的曾经没有我的故事 提交于 2019-11-30 11:54:24
1、什么是闭包? 闭包是指有权访问另外一个函数作用域中的变量的函数。可以理解为(能够读取另一个函数作用域的变量的函数) 1 function outer() { 2 var a = '变量1' 3 var inner = function () { 4 console.info(a) 5 } 6 return inner // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域 7 } 很多人会搞不懂匿名函数与闭包的关系,实际上,闭包是站在作用域的角度上来定义的。因为inner访问到outer作用域的变量,所以inner就是一个闭包函数。虽然定义很简单,但是有很多坑点,比如this指向、变量的作用域,稍微不注意可能就造成内存泄露。我们先把问题抛一边,思考一个问题:为什么闭包函数能够访问其他函数的作用域 ? 2、从堆栈的角度看待js函数   基本变量的值一般都是存在栈内存中,而对象类型的变量的值存储在堆内存中,栈内存存储对应空间地址。基本的数据类型: Number 、Boolean、Undefined、String、Null。 var a = 1 //a是一个基本类型 var b = {m: 20 } //b是一个对象 对应内存存储: 当我们执行 b={m:30}时,堆内存就有新的对象{m:30},栈内存的b指向新的空间地址( 指向{m:30} ),而堆内存中原来的

c++第三次作业---作用域

孤街浪徒 提交于 2019-11-30 10:36:20
c++第三次作业----作用域 1:什么是作用域 作用域是一个标识符在程序正文中有效的区域,即定义的变量可以被应用的有效区域,下面会举出对应的例子进行进一步解释。 2:局部作用域 下面给出一个函数实例 #include<iostream> using namespace std; int main() { int i; int b = 3; for (i = 0; i<1; i++) { int b = 1; cout << b << endl; } cout << b << endl; } 如上面的代码所示,这是一个简单的main函数,其中在函数内部定义了一个整形变量b在函数内部中还有一个for循环结构,不难看出在for循环结构中还有一个b并且两个b的赋值是不一样的,我们在不同的地方对两个b的值进行输出发现输出的b的值也不一样,其实这就是因为b的作用域不同的原因导致的,比如第一个b作用域为整个函数,而第二个b作用域只在for循环中存在一旦超出这个循环后它的值就不再起任何的作用,所以因为作用域的不同导致了输出结果的不同。 3:类作用域 类的作用域同样的下面也给出一个实例 #ifndef a_h #define a_h class Clock { int hour, minute, second; public: void settime(int a, int b, int c);

ECMAScript6 入门-let与const命令

僤鯓⒐⒋嵵緔 提交于 2019-11-30 10:18:50
块级作用域   1:let命令声明的变量只在let命令所在的代码块有效--简而言之 大括号既是代码块,也就是说存在块级作用域了. { let a =10; var b =1; } a // ReferenceError: a is not defined. b //1   重点:所以let命令很适合在for循环当中, 并且for循环的设置循环变量的那个区域是个父级作用域,循环体里面是一个子作用域    注释:下面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6,这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6 //体现功能点:for循环设置循环变量的作用域 与 循环体是不同的作用域//for循环变量的作用域是循环体的父级作用域 for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc    不存在变量提升   1

函数的返回值和作用域

余生颓废 提交于 2019-11-30 10:09:03
1、函数返回值 def func(name,age,country): user_info = {} user_info['name'] = name user_info['age'] = age user_info['country'] = country return user_info my_user_info = func('xu', 10, 'CN') 注意: 1、函数在遇到return语句时,就会停止执行函数,并将值返回,即return语句代表函数执行结束 2、如果函数里没有return语句,就会默认返回None 如果想返回多个值: 则用return user_info, country 返回多个值时,其返回的值是以元组的形式返回。 2、 作用域 name = "xu cool" def func(): name = "dashuaibi" print("里面的name:", name) func() print("外面的name:", name) 打印结果:里面的name: dashuaibi 外面的name: xu cool 为什么在函数里面改了name,在外面输出name的时候,并没有发生改变呢? 1、在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。 2、全局变量作用域(即有效范围)是整个程序,局部变量作用域是定义该变量的函数。 3

var&&let&&const

∥☆過路亽.° 提交于 2019-11-30 09:31:30
let: 1、不能再同一个作用域里重复声明同一个变量。(报错:语法,重复声明) 2、全局作用域中let声明的变量不会自动成为Window对象的属性 3、let声明的变量 用变量提升的,该变量之前成为暂时性死区(变量已在当前的作用域但是不能够进行使用) 4、let声明的变量没有赋值就会报错 5、let声明的变量会让{}()自动成为代码块,全局作用域无法访问 var: 1、能够在同一个作用域里重复声明同一个变量。 2、全局作用域中var的变量会自动成为window对象的属性。 3、var声明的变量存在 变量声明提升,js引擎会把var声明的变量提到最前面 执行到相应代码时进行赋值。 4、var声明的变量没有赋值是undefined 5、var声明的变量不能让{}()生成块级作用域。 const: 1、用来声明变量的 (一般用来声明不会改变的量 如:圆周率、光速、) 2、声明的同时要赋值,否则报错 3、声明的常量如果是原始值则该常量不能被修改,引用值在不修改常量地址的情况下可以修改 1、var声明 for() 中的()不存在块级作用域。 var a = 0; for (var i = 0; i < 5; i++) { a += i; } console.log(a, i) let声明 for() 中的()存在块级作用域。 var a = 0; for (let i = 0; i < 5;

js作用域for循环闭包问题

烈酒焚心 提交于 2019-11-30 08:37:29
for(var i = 0;i<btnArr.length;i++){ btnArr[i].addEventListener('click',function(){ tabCardShow(i); }); } 普通的for循环,触发事件时传入的 i 的值一定是等于 btnArr.length ,i 的值停留在了循环执行完毕之后,并不符合初衷。 原因:i只作用于 for循环的作用域,所有 元素绑定时传入的都是该作用域的同一个 i 值,而 i 值停留在了循环最后一次的值上。 for(var i = 0;i<btnArr.length;i++){ (function(i){ btnArr[i].addEventListener('click',function(){ tabCardShow(i); }) })(i); } 原因:闭包传入i值,相当于每次循环都创造了一个作用域,向传入了 i 值,避免了污染,循环了多少次 ,就有多少个作用域,就有多少个 i 值。 来源: https://www.cnblogs.com/JianXin1994/p/11576077.html