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

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

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

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

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

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

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

相关·内容

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

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

71230

作用域和闭包

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

72020
  • 《你不知道的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)

    51030

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

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

    80020

    JAVA知识基础(七):封装

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

    30350

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

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

    68620

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

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

    1.3K20

    理解 JavaScript 中的作用域

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

    93510

    C++为什么有参数依赖查找(ADL)?

    在作用域中查找名称时,会找到该名称的所有声明,有一个例外,被称为“struct hack”或“类型/非类型隐藏。...c 代码解读复制代码// 要访问被隐藏的类型名称,你必须使用详细类型说明符(elaborated type specifier)。这通常涉及到使用作用域运算符::来指定完整的类型名称。...例如,如果你有一个名为MyType的类和同名的变量MyType,你可以使用::MyType来指代类类型class MyType {};int MyType = 10; // 同一个作用域内,MyType...查找会在多个作用域中进行,直到找到至少一个声明为止:文件作用域:在全局(顶层命名空间)中,查找会在名称使用之前的作用域中进行。...支持自定义操作:ADL使得程序员可以在自己的类型所在的命名空间中定义与标准库类型相关的操作,如自定义的swap函数。这样,当使用标准库算法时,这些自定义操作可以被自动使用。

    12110

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

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

    1.7K60

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

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

    45020

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

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

    55220

    JS学习系列 02 - 词法作用域

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

    1.1K30

    C++继承

    三、继承中的作用域 1. 在继承体系中基类和派生类都有独立的作用域,所以可以有同名成员。 2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。(返回值和参数可以不相同) 4....,注意重载只能在一个作用域中才能重载,而这里的A,B一个是子类另一个是父类,构成了两个定义域,子类和父类是两个独立的作用域!...如果子类想访问,就需要将其定义在自己作用域中。 六、继承与静态成员 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。...2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 3.

    6910

    【前端】JavaScript作用域与预解析:深入理解问题与解答

    if (x) 判断时,使用的是函数作用域中的局部 x,初始值是 undefined。...这说明函数声明不仅仅是定义一个可调用的代码块,它也会在当前作用域中创建一个变量,这个变量的名字与函数名相同。...变量遮蔽与作用域链 当函数内部声明一个与外部变量同名的变量时,这个内部变量会遮蔽外部的变量,这就是所谓的作用域链中的遮蔽现象。...遮蔽意味着在当前作用域中,同名的外部变量变得不可访问,除非使用特定的方式(例如 this 或全局对象)访问全局变量。...函数声明是局部变量的声明: 在函数内部声明函数,相当于在当前作用域创建了一个局部变量,且初始值为函数对象。 变量遮蔽: 函数内部的变量会遮蔽外部的同名变量,函数声明也会有类似的行为。

    10510

    十、继承

    这被称为“名称隐藏”或“名称覆盖”。 如果需要访问被隐藏的基类成员,可以使用作用域解析运算符(::)来明确指定访问的类。...继承中的同名成员 在C++中,当子类(派生类)和父类(基类)中存在同名成员时,这些成员实际上是在不同的作用域中定义的。这种情况主要涉及到成员函数(方法)和成员变量(属性)。...处理这些同名成员时,需要特别注意作用域解析运算符(::)的使用以及成员函数重写(Overriding)和隐藏(Hiding)的概念。...成员变量 对于成员变量,如果子类定义了一个与父类同名的成员变量,那么这两个变量实际上是在不同的作用域中。子类中的同名成员变量会隐藏父类中的同名成员变量。...此时,如果子类中的成员函数想要访问父类中被隐藏的成员变量,需要使用作用域解析运算符(::)来明确指定要访问的变量属于哪个类。

    7710

    带你了解 JavaScript 作用域

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

    29830

    Java基础:Java面向对象

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

    52530

    JAVASCRIPT FUNCTIONS 详解

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

    74510

    js变量提升 和函数提升

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

    1.4K41
    领券