作用域

一个有意思的js块作用域问题

旧巷老猫 提交于 2019-11-30 16:51:22
1.问题 首先把问题放出来,昨天看了一个网友发的一个问题,然后跟我同事一起研究了一下,没找出来是为什么,然后我回来一直在想为什么,然后各种找资料研究,从各个方面找为什么,比如js上下文,作用域,js垃圾回收,堆栈调用情况等等。 2.js断点调试找答案 首先如果不看上面的图,以你现在知道的js知识,你觉得打印出来应该是什么。第二张图其实打印出来的结果在意料之中,原因就是函数声明提升,没问题,但是第一张图为什么呢?这里可以发散一下思维,比如说是不是在块作用域中,变量和函数之间存在某种互相覆盖的问题啊,或者说先在块中声明的会被挂载到全局的window对象下面,后面声明的就挂载不上去了,并且不会覆盖,然后可以把代码稍微改改,验证一下你的思想,很有意思。然后下面我们断点调试看下: 首先进花括号一步都没走的时候,但是a和b已经挂载到全局变量的window对象下面了,这就说明代码块中隐式生命的变量是全局变量,代码相当于这样: 此时我们再看a在 块作用域中就已经是方法了,注意此时我 function a(){} 这段代码还没走完呢,这就说明函数声明在js解析 (注意是解析不是执行)的时候代码块中被提升到了代码块顶部,进花括号的那一刻起,函数就已经被声明了,我们再往下面一步走 此时a不管在 块作用域还是 全局作用域中都变成了a函数,那这里是都可以理解为运行上面一行代码

Python【day 10】函数进阶-小结

喜你入骨 提交于 2019-11-30 16:17:42
本节主要内容1、动态参数 *args **kwargs 形参:*args将多个位置参数聚合打包成元组 **kwargs将多个关键字参数聚合打包成字典 实参:*li1将列表进行解包打散成多个位置参数 **dic1将字典进行解包打散成多个关键字参数 形参顺序: 位置参数、 动态参数:*args接收多个位置参数,聚合打包成元组 默认值参数 动态参数:**kwargs接收多个关键字参数,聚合打包成字典2、名称空间-命名空间 含义:python解释器开始执行的时候,就会开辟一个空间,每当遇到一个变量,就把变量名和值的对应关系记录下来, 这个存放变量名字和值关系的内容空间就叫名称空间(也叫'命名空间') 分类: 内置名称空间:存在python解释器为我们提供的名字,比如:list,dict,tuple,str,int等都是内置名称空间 全局名称空间:函数外申明的变量会存放在全局名称空间 局部名称空间:函数内申明的变量会存在在局部名称空间 加载顺序:内置名称空间>全局名称空间>局部名称空间(函数执行的时候) 取值顺序:局部名称空间>全局名称空间>内置名称空间3、作用域 含义:作用域就是作用范围 分类: 全局作用域:内置名称空间+全局名称空间 局部作用域:局部名称空间 查看: globals()函数:查看全局作用域中的内容-(全局变量和全局作用域中的函数信息) locals()函数

C# 类中访问修饰符的优先级与用法(public, internal, protected, private)

[亡魂溺海] 提交于 2019-11-30 16:14:50
首先:类成员的访问级别是以类的访问级别为上限的! 也就是类的访问级别低时,类成员的访问级别高也无法突破类的访问级别 public级别,作用域是这个解决方案() internal级别,作用域是整个装配集(Assembly) protected级别,作用域是整个解决方案()中以它自己的类为基类以及它的派生类 private级别,作用域是它自己的类内部(class) 来源: https://www.cnblogs.com/maomaodesu/p/11603600.html

Python-作用域

强颜欢笑 提交于 2019-11-30 15:14:56
一个标识符的可见范围,就是标识符的作用域。一般常说的是变量的作用域。 先看一段代码 # -*- coding:utf-8 -*- x=5 def foo(): print(x) foo()    1 x=5 2 def foo(): 3 x+=1 4 print(x) 5 foo() 问:x到底可见不可见? 这里就引入2个概念 全局作用域 --global 在整个程序运行环境中可见。 局部作用域-- local 在函数,类等内部可见。局部变量使用范围不能超过其所在的局部作用域。 回到上面的函数 第一段代码中x=5定义在函数外部,相当全局作用域,在整个程序运行环境中可见。所以第1段程序是没有问题的。 第2段代码会报本地变量未赋值被引用。Why?赋值即定义,x+=1相当于在函数内重新定义了1个局部变量x,那么foo内部所有X都是这个局部变量X,但是X没完成赋值就被右边拿来做加1操作了(赋值语句先执行等号右边的)。 嵌套函数 eg1 1 # -*- coding:utf-8 -*- 2 def outer1(): 3 o=65 4 def inner(): 5 print("inner {}".format(o)) 6 print(chr(o)) 7 print("outer {}".format(o)) 8 inner() 9 10 outer1() 输出结果: outer 65

javascript中var与let与const的区别

无人久伴 提交于 2019-11-30 14:52:49
var与let的区别 到ES6的时候,javascript中声明变量的方式有三种var、let、const 1:作用域只是局限于当前代码块 { var str = "aaa"; console.log(str);//aaa let str1 = "dddd"; console.log(str1);//dddd } console.log(str);//aaa console.log(str1);//报错,str1 is not defined 上面代码中采用var 和 let 分别申明了变量,采用var 申明的变量在外面可已使用,但采用let申明的变量只能在当前代码块中使用,在外边是用不了。 2:使用let 申明的变量作用域不会提升,而采用var申明的会作用域提升。 采用var申明变量 //采用var 申明的变量作用域会提升 { console.log(a);//输出undefined var a = "dd"; } 上面的代码经过作用域提升之后相当于下面的代码 //作用域声明提升总是会将变量的申明提升到当前作用域的最前面,如下所示 { var a; console.log(a);//因此输出为undefined a = "ddd"; } 采用let申明的变量作用域不会提升,因此下面代码将会报错 { console.log(b);//这里将会报错,因为b没有申请 let b =

var和let/const的区别

丶灬走出姿态 提交于 2019-11-30 14:52:33
let 和 const 是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的 var 有许多不同,并且 let 和 const 也有一些细微的不同,再认真阅读了阮一峰老师的 文档 后,发现还是有一些不知道的细节… 博客 、 前端积累文档 、 公众号 、 GitHub 内容: var 和 let / const 的区别 块级作用域 不存在变量提升 暂时性死区 不可重复声明 let、const声明的全局变量不会挂在顶层对象下面 const 命令两个注意点: const 声明之后必须马上赋值,否则会报错 const 简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改。 为什么需要块级作用域? ES5只有全局作用域和函数作用域,没有块级作用域。 这带来很多不合理的场景: 内层变量可能覆盖外层变量 用来计数的循环变量泄露为全局变量 var tmp = new Date ( ) ; function f ( ) { console . log ( tmp ) ; // 想打印外层的时间作用域 if ( false ) { var tmp = 'hello world' ; // 这里声明的作用域为整个函数 } } f ( ) ; // undefined var s = 'hello' ; for ( var i = 0 ; i < s .

JavaScript中var、let和const的区别

烈酒焚心 提交于 2019-11-30 14:51:56
一、前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var 、 let 、 const 、 function 、 class ,本文主要讨论 var 、 let 和 const 之间的区别。 二、var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域。举例说明: var a = 1; //此处声明的变量a为全局变量 function foo(){ var a = 2;//此处声明的变量a为函数foo的局部变量 console.log(a);//2 } foo(); console.log(a);//1 如果在声明变量时,省略 var 的话,该变量就会变成全局变量,如全局作用域中存在该变量,就会更新其值。如: var a = 1; //此处声明的变量a为全局变量 function foo(){ a = 2;//此处的变量a也是全局变量 console.log(a);//2 } foo(); console.log(a);//2 注意: var 声明的变量存在 提升 (hoisting)。 三、提升 提升是指无论 var 出现在一个作用域的哪个位置

let 和 const 以及var 区别

故事扮演 提交于 2019-11-30 14:51:38
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。 ES6中增加了块级作用域的概念, let 命令 1. let 命令,用来声明变量。它的用法类似于 var ,但是所声明的变量,只在 let 命令所在的代码块内有效。 { let a =10; var b= 8; } console.log(a);//ReferenceError: a is not defined(let声明的变量只在当前代码块内有效) console.log(b);//1 2. 不存在变量提升 对比: var 命令会发生”变量提升“现象,即变量可以在声明之前使用,值为 undefined // var 的情况 console.log(a); // 输出undefined var a = 2; // let 的情况 console.log(b); // 报错ReferenceError let b = 2; 3. 不允许重复声明 let 不允许在相同作用域内,重复声明同一个变量。 4. 暂时性死区 只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。 var tmp = 888; if

var let const的区别是什么?

断了今生、忘了曾经 提交于 2019-11-30 14:51:03
let和const有很多相似之处,先说一说let吧。 原文地址:http://www.cnblogs.com/liuhe688/p/5845561.html 1. let添加了块级作用域 我们知道,JavaScript是没有块级作用域的,如果在块内使用var声明一个变量,它在代码块外面仍旧是可见的: if (true) { var foo = 3; } console.log(foo); // 3 for (var i = 0; i < 9; i++) { var j = i; } console.log(i); // 9 console.log(j); // 8 可以看到,在上面代码中,我们虽然是在块内声明的变量,但代码块执行完毕后,依然可以访问到相应的变量,说明JavaScript中没有块级作用域的。 而ES6规范给开发者带来了块级作用域,如果把var换成let命令,我们就可以获得一个块级变量: if (true) { let foo = 3; } console.log(foo); // Uncaught ReferenceError for (let i = 0; i < 9; i++) { let j = i; } console.log(i); // Uncaught ReferenceError console.log(j); // Uncaught

C语言作用域和链接属性

六月ゝ 毕业季﹏ 提交于 2019-11-30 14:43:13
一.作用域 当变量被定义在程序不同位置时,它的作用范围是不一样的,这个作用范围就是我们所说的作用域。 C语言编译器可以确认4种不同类型的作用域: ——代码块作用域 ——文件作用域 ——原型作用域 ——函数作用域 1.代码块作用域 在代码块中定义的变量,具有代码块作用域。作用范围是从变量定义的位置开始,到标志该代码块结束的右大括号{}处 尽管函数的形式参数不在大括号内定义,但同样具有代码块作用域,隶属于包含函数体的代码块 #include <stdio.h> int main(void) { int i = 100; // i1 { int i = 110; // i2 { int i = 120; // i3 printf("i = %d\n", i); } // i = 110 { printf("i = %d\n", i); int i = 130; // i4 printf("i = %d\n", i); } printf("i = %d\n", i); } printf("i = %d\n", i); return 0; } 2.文件作用域 任何在代码块之外声明的标识符都具有文件作用域,作用范围是从它们的声明位置开始,到文件的结尾处都是可以访问的。 另外,函数名也具有文件作用域,因为函数名本身也是在代码块之外。 #include <stdio.h> void func