for循环外面的变量i就已经变成了10,使用console.log(i)从作用域查找到的i值就是10,因此十次setTimeout()中的代码就都打印出了10。...解决方式 原因找到了,罪魁祸首说到底就是由于var变量的作用域特性以及作用域范围导致的。那解决这个问题的关键点还是在怎么控制变量的作用域。...方法一 要控制变量的作用域,最常见的手段,就是使用函数闭包将变量值封闭在指定的作用域内。...方法二 除了函数闭包,我们还可以使用的解决方案,就是ES6中新引入的let变量声明。与var不同的是,由let声明的变量的作用域是只在其声明的块或子块中可用,所以它被称为块级作用域变量。...) { console.log(i) }) } 使用了let后,变量i的作用域被限定在for语句块以及子块setTimeout()中,并且: 子块中的变量值是该子块产生时的那个值 是不是觉得
但是实际开发里如果我们对基本类型和引用类型的区别不是很清晰,就会碰到我们很多不能理解的问题,下面我们来看看下面的代码:var str = "sharpxiajun";str.attr01 = "hello...讲作用域链首先要从作用域讲起,下面是百度百科里对作用域的定义:作用域在许多程序设计语言中非常重要。...通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。 作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。...,这个环境就是window,window环境不需要我们自己使用什么方式构建,页面加载时候页面会自动构造的,上面代码里有一个大括号,这个大括号是对函数的定义,运行之,我们发现函数作用域内部定义的s2变量是不能被...广大程序员对作用域链的理解有两块一块是作用域,而作用域在javascript语言里指的是执行环境execution context,执行环境在javascript引擎里是通过上下文变量体现的variable
昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内容,但无法进行处理。 - WSDL 文档包含无法解析的链接。 ...- 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 - 远程主机强迫关闭了一个现有的连接。...元数据包含无法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。...元数据包含无法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。...经过一轮谷百之后,发现网上有很多类似的情况,有的说是因为用了wsHttpBinding协议引起的,或者是元数据没有正确公开,但都不是他们说的情况。后来找到了一篇文章,说的是添加WCF引用的一个陷阱。
作用域 我们可以把作用域理解为上面讲到的这套规则下的限定范围。作用域的职责是,在这段限定范围中根据这套设计好的规则存储所声明的变量,并且提供修改该变量的支持。...代码执行中对外部作用域的变量的引用,通过这一条链条进行变量的查找、读取、修改。 代码执行中对某个变量的访问大致如下: 当代码要访问一个变量时,首先会搜索当前内部词法环境。...name从当前functionLexicalEnvironment中查找到并获取, 变量phrase沿作用域链查找,从moduleLexicalEnvironment中查找到并获取 */ console.log...其中,变量name作为函数参数属于当前函数作用域的局部变量,变量可以直接从当前函数的词法环境functionLexicalEnvironment中查找到并返回相关信息。...值得注意的是console.log()是全局内置对象console上的方法,对该方法的调用需要引用console。
作用域我们可以把作用域理解为上面讲到的这套规则下的限定范围。作用域的职责是,在这段限定范围中根据这套设计好的规则存储所声明的变量,并且提供修改该变量的支持。...代码执行中对外部作用域的变量的引用,通过这一条链条进行变量的查找、读取、修改。代码执行中对某个变量的访问大致如下:当代码要访问一个变量时,首先会搜索当前内部词法环境。...name从当前functionLexicalEnvironment中查找到并获取, 变量phrase沿作用域链查找,从moduleLexicalEnvironment中查找到并获取 */ console.log...其中,变量name作为函数参数属于当前函数作用域的局部变量,变量可以直接从当前函数的词法环境functionLexicalEnvironment中查找到并返回相关信息。...值得注意的是console.log()是全局内置对象console上的方法,对该方法的调用需要引用console。
这个类型主要是让我们可以将一组整型常量组织在一起,像一个简单的文件夹一样 C原本只有一种枚举类型:不限定作用域的枚举。C11加入了限定作用域的枚举。...不限定作用域的成员由于作用域与类型名相同,所以可以被直接用名字访问无需指定,但是这样也引来了重复定义名称的问题 不限定作用域的枚举类的名称是可选,如果这个enum未命名,则必须在定义该enum时就定义它们的成员...限定作用域的枚举类在定义时需要加class/struct,即如enum class TypeName{mem1, mem2, mem3}; 限定作用域的枚举类的成员由于作用域在枚举类的内部,所以必须通过访问符才能得到...,但是使用枚举类成员赋值给其他元素时,成员会自动转换为整型 限定作用域的枚举成员默认类型是int,不限定作用域的枚举成员则没有默认类型,我们只能知道其类型足够容纳其初始值。...,此时我们希望编译器不要随便对这样的变量进行优化,我们可以通过volatile限定符来声明这个变量是不需要进行优化的 volatile的用法和const很相似,只起到修饰作用,与const并不冲突 只有
文件作用域限定符. static 修饰局部变量(声明静态存储区) : 1.作用 : 说明该局部变量存储在静态存储区. 2.初始化次数 : 该值只会***初始化一次***, 之后会被不断赋值, 调用该局部变量所在方法...如果是第一次调用, 那么就初始化这唯一的一次. 3.声明周期 : 该局部变量的生命周期***从第一次初始化直到程序退出为止***. static 修饰全局变量和函数(声明作用域) : 1.修饰全局变量...调用5次method2()方法, local_variable_static 变量只初始化一次, 之后每次都沿用上一次的值. ---- (3) static 关键字 代码示例 ( 限定变量和方法 作用域...= 666; //静态全局变量, 同时限定其作用域是本文件, 不能被外部文件使用. static int test_2_global_static = 444; //通过调用该方法, 可以在外部文件访问该方法...= 666; //静态全局变量, 同时限定其作用域是本文件, 不能被外部文件使用. static int test_2_global_static = 444; //通过调用该方法, 可以在外部文件访问该方法
C++类和对象起点之章 一、前言 二、面向过程/对象区别 三、类的引入 四、类的定义 五、类的访问限定符及封装 1、访问限定符 2、封装 六、类的作用域 七、类的实例化 八、类对象模型 1、类对象的大小计算...: 修饰的成员在类外可以直接被访问 protected(保护)/private(私有): 修饰的成员在类外不能直接被访问(此处protected和private是类似的) 说明: 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止...protected/private把成员封装起来,开放一些公有的成员函数对成员合理的访问,进行有效管理数据等 六、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中 在类体外定义成员...限定了类有哪些成员(类型和方法) 定义出类只是相当于一种承诺,并不会分配实际的内存空间来存储成员 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量(对于成员函数会存在于代码段中...类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量 this指针可以为空吗?
引用其外层作用域setHandler的elem(典型的闭包)。...通过这种内存结构可以得出结论:即使handler内没有任何代码,一些特殊的方法比如addEventListener/attachEvent也能够从其内部创建相关引用。...但是,因为闭包机制,如果关联外层作用域的内层函数保持活跃,外层的所有变量也会被保留。...函数作用域就不会被回收,变量data将会占用内存资源。...JavaScript解释器无法判断哪个外层变量被内层函数引用,所以它选择保留外层的所有变量。
建议仅在部分 "内核" 代码中使用接口,从语义上考虑,可以更多的使用抽象类。 静态变量 静态变量属于类,而不属于类的某个实例。这个变量对所有实例都有效。...::是作用域限定操作符,这里用的是self作用域,而不是$this作用域,$this作用域只表示类的当前实例,self::表示的是类本身。...但是在本类中可以用$this->获取到值 Static:: 类中static::后只能const或者static变量 static 关键字,这里作为作用域引用。...与parent和self不同的是,parent 引用的是父类作用域,self引用的是当前类的作用域,而static引用的是全部静态作用域,子类会覆盖父类 栈和堆 一般认为在c中分为这几个存储区:...另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this。
作用域与作用域链 通常来说,一段程序代码中所用到的名字并不总是有效或可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域scope。...当一个方法或成员被声明,他就拥有当前的执行上下文context环境。在有具体值的context中,表达式是可见也都能够被引用。如果一个变量或者其他表达式不在当前的作用域,则将无法使用。...作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。...全局作用域 直接声明在顶层的变量或方法就运行在全局作用域,借用函数的[[Scopes]]属性来查看作用域,[[Scopes]]是保存函数作用域链的对象,是函数的内部属性无法直接访问但是可以打印来查看。...localContext的作用域,也可以称为局部作用域 块级作用域 代码块内如果存在let或者const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。
类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类的对象大小的计算 计算类对象的大小 类对象的存储方式 类成员函数的this指针 引出 特性 this指针可以为空吗...类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。...public修饰的成员在类外可以直接被访问 protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的) 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止...,如果后面没有访问限定符,作用域就到 } 即类结束。...类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
获取数组元素也是一样通过下标获取,下标从 0 开始,而且 JavaScript 的数组可以随意根据下标进行赋值,不管你的数组长度,因为 JavaScript 的数组长度是动态的。 ?...JavaScript 中 词法作用域的规则为: 函数内部的变量允许访问函数外部的。 整个代码结构只能函数限定作用域,这就是为什么上文说使用自调用函数来开辟新的作用域的原因了。...局部作用域:在函数内部就是局部作用域,在这里定义的内部变量也就是局部变量。 块级作用域:这个是 ES6 才有的,简单说下,就是只使用一对大括号{} 括起来的就是块级作用域。 3....作用域链 只有函数才可以限定作用域,那么在要有代码,这里就至少存在一个全局作用域,而写代码难免又会有函数,这里的函数就会构成另一个作用域,如果函数中还有函数,则他还会构成一个新的作用域,等等。...直接声明一个键值对的集合 ? 这个 obj 变量就是一个对象了里面有两个属性和一个方法。使用这种方法也只适合创建一个类,因为当需要创建大量同类型的对象时,使用这个方法就需要写大量的方法。
,因为: 语法冗余; 匿名内部类中的this指针和变量容易产生误解; 无法捕获非final局部变量; 非静态内部类默认持有外部类的引用,部分情况下会导致外部类无法被GC回收,导致内存泄露。...(); 三、作用域 在内部类中使用变量名和this非常容易出错。...而lambda表达式的语义就十分简单:它不会从父类中继承任何变量,也不用引入新的作用域。lambda表达式的参数及函数体里面的变量和它外部环境的变量具有相同的语义(this关键字也是一样)。...总结:基于词法作用域的理念,lambda表达式不可以掩盖任何其所在上下文的局部变量。...this对未限定字段的引用和未限定方法的调用本质上都属于使用final局部变量。
和类一样,每个枚举类型定义了一种新的类型。C++包含两种枚举,限定作用域的和不限定作用域的。对于不限定作用域的枚举类型,名字是可选的。如果 enum是未命名的,必须在定义的同时定义它的对象。...与之相反,在不限定作用域的枚举类型中,枚举成员的作用域与枚举类型本身的作用域相同。...有三种方法可以从指向成员函数的指针中生成可调用对象。 使用标准库模板 function。需要指明对象是否是以指针或引用的形式传入。...嵌套类的名字在外层类作用域中是可见的,在外层内作用域之外的可见性由其访问权限修饰符决定。嵌套类可以直接使用外层内的成员,无需对该成员的名字进行限定。...取地址运算符不能作用于位域,因此任何指针都无法指向类的位域。 直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制。例如,程序可能包含一个由系统时钟定时更新的变量**。
访问方法如下图: 其实光这样是访问不了函数的,接下来就需要我们的域作用限定符了。 域作用限定符: c++提出了3种访问限定符: public修饰的成员可以在域外直接被访问。...访问权限作用域从该访问限定符出现到下一个访问限定符出现结束(或者类结束) 如下图设置访问限定符: 在c++的惯例中成员变量都设置为私有,成员函数都设置为公有,因为惯例一般不要直接修改数据,修改数据都要函数去做...类的声明和定义分离: 当一个类需要声明和定义分离时,不能按以前的方法,简单的声明定义分离,我们先来了解一下编译器的搜索原则:先局部域再全局域 类会形成一个新的域叫类域。 ...冷知识: 如果没有成员变量,只有成员函数又或者都没有的情况,类的大小是多少呢? 这两种的情况,类的大小都规定是1,因为如果一点空间都不给,就无法证明这个类存在过。...this指针被const了无法被修改,可以注意一下const的位置,补充一个小知识点: const在*前 修饰指针指向的内容 const在*后 修饰指针本身 其实根据它的作用也可以判断出,可以用过
2、由于局部变量和成员变量同名,根据局部优先的原则,前面的year肯定是局部变量,我们对他初始化就没有意义了 建议设置成员变量的时候要加点标志,比如_ class Date { public: void...三、类的访问限定符 C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。...访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 4. 如果后面没有访问限定符,作用域就到 } 即类结束。...四、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。...猜测2:代码只保存一份,在对象中保存存放代码的地址 猜测3:只保存成员变量,成员函数存放在公共的代码段 我们再通过对下面的不同对象分别获取大小来分析看下 结论:一个类的大小,实际就是该类中”成员变量
引用: 左值引用 &代表左值引用,左值引用的是表达式结束后仍存在的值,既是左值引用的必有地址,左值引用时可以引用变量,但变量必须先进行定义。...例如 int a=1;int&p=a; 右值引用: &&代表的是右值引用,右值引用可以引用表达式或者是具体的某个值,例如0;此类都是无法取址的,像例如a++是右值引用,而像++a则是左值引用。...枚举: 定义时使用enum定义的是不限定作用域的枚举,而enum class或enum struct定义的则是限定作用域的枚举,限定作用域的优点是可以在不同的作用域内设定同样的成员名字,而不限定作用域的枚举则不能这样...=v.end();it++) {cout<<it;//解引用,返回迭代器所指的元素 } It->mem 解引用,获取该元素成员mem It==it1 相等则说明指示为同一个元素或是同一个容器的尾后迭代器...,此时输出的就是n本身,可以对函数进行操作,既是对n操作。
类定义中的类型变量是指定方法的返回类型以及域和局部变量的类型 //域 private T one; //返回类型 public T getOne() { return one; } //局部变量 public...带有超类型限定的通配符的行为与子类型限定的通配符行为完全相反,可以为方法提供参数,但是却不能获取具体的值,即访问器是不安全的,而更改器方法是安全的: 编译器无法知道setOne方法的具体类型,因此调用这个方法时不能接收类型为...总结一下: 带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。 问题九:泛型在虚拟机中是什么样呢? 答: 虚拟机没有泛型类型对象,所有的对象都属于普通类。...也就是说,编译器把这个方法调用编译为两条虚拟机指令: 对原始方法cp.getOne的调用 将返回的Object类型强制转换为Singer类型。 当存取一个公有泛型域时也要插入强制类型转换。...虚拟机用cp引用的对象调用这个方法。这个对象是Coupling类型的,所以会调用Coupling.setTwo(Object)方法。这个方法是合成的桥方法。
领取专属 10元无门槛券
手把手带您无忧上云