首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在当前作用域中使用与变量同名的属性被认为是隐藏的?

在当前作用域中使用与变量同名的属性被认为是隐藏的,是因为在变量和属性具有相同名称时,访问该名称时会优先访问变量而不是属性。这种行为被称为"变量隐藏"。

变量隐藏的原因是为了避免在代码中产生歧义和混淆。当变量和属性具有相同的名称时,如果访问该名称时优先访问属性而不是变量,可能会导致意想不到的结果和错误。因此,为了保持代码的可读性和可维护性,编程语言规定在当前作用域中使用与变量同名的属性时,会隐藏变量而访问属性。

这种隐藏的行为在面向对象编程中尤为常见。在面向对象编程中,对象的属性可以被视为对象的状态,而变量可以被视为方法或函数的局部变量。当对象的属性与方法或函数的局部变量具有相同的名称时,为了避免混淆,编程语言规定访问该名称时优先访问方法或函数的局部变量而不是对象的属性。

总结起来,当前作用域中使用与变量同名的属性被认为是隐藏的,是为了避免混淆和错误,保持代码的可读性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面试官:说说JS作用域和作用域链,我是这样回答

浏览器中,全局作用认为是 window 对象,因此所有全局变量和函数都是作为 window 对象属性和方法创建。...,程序不会报错,//这是因为这两个同名变量位于不同函数内,也就是位于不同作用域中,所以他们不会产生冲突。...使用方面解释:当在Javascript中使用一个变量时候,首先Javascript引擎会尝试在当作用域下去寻找该变量,如果没找到,再到它上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域...浏览器中,全局作用认为是 window 对象,因此所有全局变量和函数都是作为 window 对象属性和方法创建。...,程序不会报错,//这是因为这两个同名变量位于不同函数内,也就是位于不同作用域中,所以他们不会产生冲突。

64030

作用域和闭包

,并实施一套非常严格规则 确定当前执行代码对这些标识符访问权限 var a = 2; 变量赋值操作会执行两个动作,首先编译器会在当作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量...因此,在当作用域中无法找到某个变量时,引擎就会在外层嵌套作用域中继续查找,直到找到该变量,或抵达最外层作用域(也就是全局作用域)为止。...window.a 通过这种技术可以访问那些同名变量所遮蔽全局变量。但非全局变量如果遮蔽了,无论如何都无法访问到。...换句话说,可以把变量和函数包裹在一个函数作用域中,然后用这个作用域来“隐藏”它们。 为什么隐藏变量和函数是一个有用技术? 有很多原因促成了这种基于作用隐藏方法。...# 规避冲突 “隐藏作用域中变量和函数所带来另一个好处,是可以避免同名标识符之间冲突,两个标识符可能具有相同名字但用途却不一样,无意间可能造成命名冲突。冲突会导致变量意外覆盖。

69420

《你不知道JavaScript(上)之作用域》读书笔记

当一个块或函数嵌套在另一个块或函数中时,就发生了作用域嵌套。所以此时在当作用域无法找到变量时,引擎就会在外层嵌套作用域中继续查找直到找到该变量,或是抵达最外层作用域(全局作用域)为止。...内部创建了一个变量 b,遮蔽了外部(全局)作用域中同名变量。...隐藏变量或函数好处是什么?...,但是由于a变量已经赋值所以a=2会在全局作用使用RHS查询a变量定义所以真实执行顺序为 var a; a = 2;console.log(a);console.log(a);// undefinedvar...(2);} 尽管var关键字定义了同名函数变量,但函数声明优先于变量声明,所以打印1;如果函数声明重复声明则取最新定义foo();//2function foo(){ console.log(1)

48030

static作用(修饰函数、局部变量、全局变量

C语言:static作用(修饰函数、局部变量、全局变量) 一、 static全局变量普通全局变量有什么区别 ? 全局变量(外部变量)说明之前再冠以static 就构成了静态全局变量。  ...把全局变量改变为静态变量后是改变了它作用域,限制了它使用范围。          static局部变量初始化一次,下一次依据上一次结果值; 三、static函数普通函数有什么区别?...static函数普通函数作用域不同,仅在本文件。只在当前源文件中使用函数应该说明为内部函数(static修饰函数),内部函数应该在当前源文件中说明和定义。...对于可在当前源文件以外使用函数,应该在一个头文件中说明,要使用这些函数源文件要包含这个头文件. static函数在内存中只有一份,普通函数在每个调用中维持一份拷贝。...例如在i和msg定义加上static,static_main.c就看不到它们了。利用这一特性可以在不同文件中定义同名函数和同名变量,而不必担心命名冲突。

64220

学习记录-Python局部变量和全局变量

,这个局部作用销毁,这个局部作用域内局部变量随之丢失2 作用重要性全局作用域中代码不能使用任何局部变量局部作用域中代码可以访问全局变量一个函数局部作用域中代码,不能使用其他局部作用域中变量在不同作用域中...两个子函数中都定义了变量egg,但在打印时,互不影响3 全局变量局部变量同名在上面说到,可以在局部作用域中调用全局变量,并且在给出例子中,我们子函数中只有一个print操作,但如果一个变量既在全局作用域中定义...这里我理解是:在局部作用域要对一个变量进行操作,Python会先在当前局部作用域查找有没有声明这个变量,如果有,就优先使用当前局部作用域中变量,如果当前局部作用作用域中没有,才会去全局作用域中寻找...通过使用global语句在局部作用域中声明了一个全局变量egg,当函数spam()调用结束后变量egg并未随之销毁5 全局变量和局部变量优先级在上面的例子中说过,如果在全局变量和局部变量同名,那么局部作用域中会优先处理在当作用域中声明变量用下面的例子进一步说明这个问题...报错显示局部变量在赋值引用,就像前面所说,当在局部作用域中处理一个变量时,Python会先查看这个变量是否在局部作用域中进行声明,然后在会在全局作用域中查找这个变量声明参考内容《Python编程快速上手

65220

JAVA知识基础(七):封装

1.概述 封装(Encapsulation)是指一种将抽象性函式接口实现细节部分包装、隐藏起来方法。 封装可以认为是一个保护屏障,防止该类代码和数据外部类定义代码随机访问。...适当封装可以让程式码更容易理解维护,也加强了程式码安全性。 2.封装优点 隐藏信息,实现细节。 良好封装能够减少耦合。 类内部结构可以自由修改。 可以对成员变量进行更精确控制。...) (例:import java.util.*;) *有如下属性: 1.java以这样两种方式导入包中任何一个public类和接口(只有public类和接口才能导入) 2.上面说到导入声明仅导入声明目录下面的类而不导入子包...,这也是为什么称它们为类型导入声明原因。...即什么属性或者方法使用必须依附于什么东西,例如使用类或接口作为挂靠单位才行(在类里可以挂靠各种成员,而接口里则只能挂靠常量)。

27350

web前端开发初学者十问集锦(4)

1.JS控制HTML元素显示和隐藏 利用JS来控制页面控件显示和隐藏有两种方法,两种方法分别利用HTMLstyle中两个属性,两种方法不同之处在于控件隐藏后是否还在页面上占空位。...因为我们在函数作用域中定义了全局变量scope同名局部变量,导致全局作用域中变量隐藏,在函数体内不可见,如果想使用全局作用域中变量使用window.var形式来显示调用。...其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数创建作用域中对象集合,这个集合被称为函数作用域链,它决定了哪些数据能函数访问。...局部变量,它在所属方法,或者说是它在自己属于对象里面才存在,这个对象或者方法使用过了,如果变量不再被引用,那么它离开作用域时会被JS引擎来销毁。...来个定义总结: a.可以访问外部函数作用域中变量函数; b.内部函数访问外部函数变量可以保存在外部函数作用域内而不被回收—这是核心,后面我们遇到闭包都要想到,我们要重点关注闭包引用这个变量

1.3K20

理解 JavaScript 中作用

另外,由于解释器总是先在当作用域中查找声明,然后才去父层作用域查找,所以 JavaScript 词法作用域引入了一个概念,变量覆盖。...意思是,如果当前函数作用域中声明了一个变量foo,那它就会覆盖 - 或者说隐藏 - 其父层作用域中声明同名比那辆。...(foo); } bar(); 上述代码打印是bar而不是foo,因为第6行foo声明覆盖了第三行同名变量声明。...函数作用域 正如我们在词法作用域中看到,解释器在当作用域声明变量,也为这函数中声明变量会在函数作用域当中。这种作用域限制于函数本身及其内部定义其他函数。...正如我们之前看到那样,这使得外部作用域访问不到隐藏变量,也不会因不必要变量污染外部作用域。 当你执行异步操作并且想要保存 IIFE 作用域中变量状态时,IIFE也非常有用。

91710

深入理解Python变量作用函数闭包

python作用域是静态,在源代码中变量赋值位置决定了该变量访问范围。即Python变量作用域由变量所在源代码中位置决定。...2.4作用类型: 在Python中,使用一个变量时并不严格要求需要预先声明它,但是在真正使用它之前,它必须被绑定到某个内存对象(定义、赋值);这种变量绑定将在当作用域中引入新变量,同时屏蔽外层作用域中同名变量...如果希望在L中修改定义在non-L变量,为其绑定一个新值,Python会认为是在当L中引入一个新变量(即便内外两个变量重名,但却有着不同意义)。...即在当L中,如果直接使用non-L中变量,那么这个变量是只读,不能修改,否则会在L中引入一个同名变量。这是对上述几个例子另一种方式理解。...这里需要注意是global关键字,使用了这个关键字之后,在nested函数中使用spam变量就是全局作用域中spam变量,而不会新生成一个局部作用域中spam变量

1.6K60

JavaScript 面试要点:作用域和闭包

: 编译器在当作用域中声明一个变量(如果之前没有声明过) 在运行时,引擎会在作用域中查找该变量,如果能够找到就会对它赋值 # 作用域嵌套 function foo (a) { console.log...(a + b); } var b = 2021; foo(1); // 2022 在当作用域中找不到某个变量时,引擎就会在外层嵌套作用域中继续查找,直到找到 或 到达最外层作用域(全局作用域)...在多层嵌套作用域中可以定义同名标识符,这叫作 “遮蔽效应”(内部标识符“遮蔽”了外部标识符)。...# 函数作用域 函数作用含义是指,属于这个函数全部变量都可以在整个函数范围内使用及复用(事实上在嵌套作用域中也可以使用)。...使用 let 进行声明不会在块作用域中进行提升。声明代码运行之前,声明并不“存在”。

42120

推翻JavaScript中三座大山:作用域篇

综上,不建议使用eval和with这两种方法。 函数作用域和块作用一章说到了作用域,那么javascript中不仅有函数作用域还存在块作用域。...【函数作用域】 函数作用域中属于这个函数全部变量都可以在整个函数范围内使用及复用。...除了正常声明一个函数然后定义函数外,我们还可以使用函数来包裹一个代码块,从而实现将代码块中变量隐藏起来实现最小暴露原则;从而只暴露那些必要变量或是函数,从而规避一些命名冲突。...这里有两个典型做法,第一种就是全局空间命名,用一个复杂名字来定义某个对象,然后将要暴露出来变量作为该对象属性,规避变量冲突;第二种就是模块管理,强制所有标识符都不能注入共享作用域中去。...提升 上一部分说到,任何声明在某个作用变量都将附属于这个作用域。但是变量作用域中声明位置作用域存在微妙联系。不管是变量赋值还是函数定义,所有声明都会提升到各自作用域最顶部。

52320

JS学习系列 02 - 词法作用

两种作用域 “作用域”我们知道是一套规则,用来管理引擎如何在当作用域以及嵌套作用域中根据标识符名称进行变量查找。 作用域有两种主要工作模型:词法作用域和动态作用域。...注意,这里结果打印是 2。 可能会有一些同学认为是 10,那就是没有搞清楚词法作用概念。...因为 eval("var a = 10;") 在 foo 作用域中新创建了一个同名变量 a,引擎在 foo 作用域中对 a 进行 RHS 查询,找到了新定义 a,值为 10,所以不再向上查找全局作用域中...with 可以将一个没有或有多个属性对象处理为一个完全隔离词法作用域,因此这个对象属性也会被处理为定义在这个作用域中词法标识符。...尽管 with 块可以将一个对象处理为词法作用域,但是这个块内部正常 var 声明并不会限制在这个块作用域中,而是添加到 with 所处函数作用域中。 严格模式下,with 完全禁止使用

1.1K30

带你了解 JavaScript 作用

#什么是## 作用概念 现代编程语言最基本功能之一就是能够存储变量当中值,以便于之后使用于修改。也正是这个功能将状态带给了程序。...4.引擎运行时会首先查询当前作用域是否存在叫做 foo 变量。如果有引擎则会使用这个变量,否则会一直向上层作用域查找。...总结:变量赋值会执行两个动作:首先是编译器在当作用域中声明变量(如果变量未被声明过);接着运行时引擎在作用域查找该变量,能找到就会对它赋值。...当一个块或函数嵌套在另一个块或函数中时,就发生了作用嵌套。因此在当作用域中没有查找到目标变量时,会逐层向上查找直到全局作用域。...如果LHS查询在所有嵌套作用域中都没有找到所需变量,引擎就会在全局作用域中创建一个具有该名称变量,并将其返回给引擎。

27930

js变量提升 和函数提升

两个最简单例子理解变量声明提升和函数声明提升 一、变量提升 变量提升即将变量声明提升到它所在作用最开始部分 例1: function fn () { var a ="hello...() {} 总结和注意点 1、变量提升 1、通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用顶端,然后进行接下来处理 2、如果当前作用域中存在此变量声明...,无论它在什么地方声明,引用此变量时就会在当作用域中查找,不会去外层作用域了 3、let和const关键字没有变量提升 2、函数提升 1、如果在同一个作用域中存在多个同名函数声明,后面出现将会覆盖前面的函数声明...2、函数声明优先级最高,会被提升至当前作用域最顶端,所以第一次调用时实际执行了下面定义函数声明,然后第二次调用时,由于前面的函数表达式之前函数声明同名,故将其覆盖,以后调用也将会打印同样结果...3、函数优先权是最高,它永远提升至作用域最顶部,然后才是函数表达式和变量按顺序执行

1.4K41

Java基础:Java面向对象

3、面向对象一般步骤 先按照名词提炼问题领域中对象 对对象进行描述,其实就是在明确对象中应该具备属性和行为 通过new方式,创建该事物具体对象(对象实例化) 通过该对象调用它以后功能 二、特性...:封装 1、概述 封装(Encapsulation)是指一种将抽象性函式接口实现细节部分包装、隐藏起来方法,也可以认为是一个保护屏障,防止该类代码和数据外部类定义代码随机访问,要访问该类代码和数据...private: 在当前类中可访问,使用对象:变量、方法。 注意:不能修饰类(外部类); default:在当前包内和访问,不使用任何修饰符。...使用对象:类、接口、变量、方法; protected: 在当前类和它派生类中可访问,使用对象:变量、方法。...,即使是共有的 子类对象调用成员变量时候,子类自己有,使用子类,子类自己没有则调用父类,出现了同名成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用 super 关键字 子类对象调用方法时候

49730

JAVASCRIPT FUNCTIONS 详解

,这个标识符将在当作用域中创建一个值为函数变量。...当我们调用它时,它创建了一个名为 inner 局部变量,这个局部变量赋值为 inner 函数,当我们使用 typeof 操作符进行检测时候,在全局作用域中 outer 函数是可以有效访问,但...因为函数声明同时还创建了一个同名变量作为他标识符,所以你必须确定在当作用域不存在其他同名标识符变量。...否则,后面同名变量值会覆盖前面的: // 当前作用域中一个变量 var items = 1; // 一个声明为同名函数 function items() { // ... }; console.log...因为作用域链在技术角度来讲属于逻辑上一个栈,所以解析器查找操作所遵循是从栈上第一个元素开始向下顺序查找。这就是为什么我们绝大部分局部变量是最后才加入到作用域链却在解析时最先找到原因。

68310

把99%程序员烤得外焦里嫩JavaScript面试题

这说明用let声明变量已经锁死在顶层作用域中,不可被其他作用变量替换。如果将let a = 14注释掉,会抛出如下图异常: ?...这说明类b也锁死在顶层作用域中,不可被其他作用变量替换。...那么p1类肯定是在第1遍处理了,只是处理方法函数不同,只是将p1类作为符号保存到符号表中,在使用p1类时并没有检测当前作用符号表,因此,只能在使用类前定义这个类。...第2遍扫描时,执行到var a = 99时,会发现函数a已经在当作用域了,所以在同一个作用域中,后面处理符号会覆盖前面的同名符号,所以函数a就被变量a覆盖了。因此,会输出99。...这就要根据执行级代码块规则了。 1. 定义变量使用var。如果发现块内有同名函数或类定义,会抛出重定义异常 2. 未使用var定义变量

47620

JS中varlet、const区别

varlet、const 一、var声明变量会挂载在window上,而let和const声明变量不会: var a = 100; console.log(a,window.a); // 100...这个变量 const c = 10; 三、let和const声明形成块作用域 if(1){ var a = 100; let b = 10; } console.log(a); // 100...(a); // 100 console.log(c) // 报错:c is not defined ===> 找不到c这个变量 四、同一作用域下let和const不能声明同名变量,而var可以 var...五、暂存死区 var a = 100; if(1){ a = 10; //在当前块作用域中存在a使用let/const声明情况下,给a赋值10时,只会在当作用域找变量a, // 而这时...* *   2、声明后不能再修改 * *   3、如果声明是复合类型数据,可以修改其属性 * * */ const a = 100; const list = []; list[0] = 10;

2.3K20

06JavaScript作用对象

变量作用域 // 声明全局变量 - 全局作用域 var msg = 100; // 声明局部变量 - 某个函数作用域 function fn() { // 局部变量 - 只能在当前函数作用域中访问...(msg); //200 } fn(); console.log(msg); // 100 因此我们可以得到结论:全局变量局部变量同名时,在函数作用域中只能访问局部变量 函数提升 函数提升变量提升较为类似...= function () { console.log("this is function"); }; fn(); // 报错:TypeError: fn is not a function 变量函数同名...检测对象属性属性值通过全等运算符 undefined 进行比较 通过 if 语句来判断对象属性是否存在 使用 in 运算符来判断对象属性是否存在 使用 Object.hasOwnProperty...比较 if判断 in运算符判断 false hasOwnProperty判断 false 构造函数基本用法 构造函数分为三种,不接受参数构造函数、接受参数构造函数使用属性构造函数。

54431

《你不知道JavaScript》:函数作用域和块作用

《你不知道JavaScript》第一部分作用域和闭包第2篇。 昨天讲到作用域,回顾下概念:作用域是一套用来管理引擎如何在当作用域以及嵌套作用域中根据标识符名称进行变量查找规则。...但这个套路反过来也是很有用,即选取所写一部分代码用函数声明来包装,从而将这些代码中所有变量都绑定在新创建包装函数作用域中,而非先前所在作用域中,目的就是通过新建作用隐藏这些变量,能够尽可能少暴露变量...除此以外,"隐藏"作用域中变量和函数还能规避同名标识符之间可能存在冲突问题。 函数作用创建方式 函数作用创建需要声明一个函数,而声明函数这个行为又有函数声明和函数表达式两种操作方式。...此时,fn变量隐藏在自身作用域中就意味着不会非必要污染外部作用域。 在前文函数表达式举例中,我还列出了匿名函数表达式,这种函数表达式常用之地是回调函数,它是没有名称标识符。...函数作用使用,可以隐藏代码实现,减少变量暴露,避免命名冲突,符合软件设计最小特权原则。关于函数作用域,还讲了函数声明函数表达式辨别方法和区别。

93130
领券