昨天记了如何在JavaScript定义类,今天把作用域相关的内容整理一下。
词法作用域(Lexical Scoping)
JavaScript中的函数是基于词法作用域的,而不是动态作用域。这句话的意思是JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。定义一个函数时,当前作用域链被保存起来并成为该函数内部状态的一部分。作用域链的顶层(最初一层)是由全局对象构成的,这和词法作用域没什么明显的关联。然而,当你定义一个嵌套函数时,作用域链将包含外层函数。这就意味着,被嵌套的函数可以访问外层函数的所有参数和局部变量。
调用对象(The Call Object)
当JavaScript解释器调用函数的时候,首先,它把作用域设置到作用域链,在函数被定义的时候,该作用域链已经有效。接下来,解释器添加一个叫做调用对象(ECMAScript规范使用术语:activation object,活动对象)的对象到作用域链的头部。引用Arguments对象的arguments属性为函数初始化调用对象。接下来,添加函数的命名参数到调用对象。所有用var语句定义的局部变量也都在这个对象中定义。因为调用对象在作用域链的头部,局部变量,函数参数和参数对象都在函数的作用域内。也就是说它们隐藏了所有同名的在更早的作用域中定义的属性。
变量的作用域和查找路径
在JavaScript中,变量的作用域有全局(window对象)作用域和函数调用作用域。
以下变量具有全局作用域:
1. 所有在最外层定义(非函数体内定义)的变量都拥有全局作用域
2. 所有末定义直接赋值的变量,系统会自动声明为拥有全局作用域的变量
3. 所有window对象的属性拥有全局作用域
以下变量具有函数作用域:
在函数体内部用var定义的变量,这里要注意一点,只要是在函数里定义的变量,就算是在最后一句定义,该变量也拥有整个函数的作用域。
作用域是层层包含的,最外层是全局作用域,里面可以包含函数调用作用域,函数调用作用域里面还可以再有函数作用域。
JavaScript查找一个变量时,会从当前作用域往上找,一直到全局作用域,直到找到为止,如果全局作用域还是没有找到,则报错。
纯粹说理论太乏味了,来点代码示例:
var msg = "red";
function a() {
alert(msg);
}
function b() {
alert(msg);
var msg = "blue";
a();
alert(msg);
}
a();
b();
上面代码的输出是:
red
undefined
red
blue
可能有不少人认为是:
red
red
blue
blue
是不是有点出乎意外!这可以用上面提到的理论来解释。
1.首先,a()的两次调用输出的都是red,这是因为a函数的作用域链是在a定义的时候就决定了,因此无论是在外层调用,还是在b里面调用,它变量空间里的msg都是外层值为red的msg,因此两次a()输出的是red。
2.b第首个alert(msg),输出的是null,而不是red,这是因为b生成调用对象call object的时候,msg变量时作为b的一个局部变量放到调用对象里的,因此不过var msg="blue"在alert(msg)之后,msg一开始就是一个局部变量存在,只是其值未设置。
3.变量的查找路径,在a中,找msg时直接找到外层的msg="red",在b中,在b函数这一层就找到了msg。
分享到:
相关推荐
以上是JavaScript学习笔记中提到的一些核心知识点,通过对这些知识点的理解和熟练应用,可以为进一步学习和掌握JavaScript打下坚实的基础。在实际开发过程中,结合具体的项目需求,这些知识会得到更深入的拓展和应用...
本学习笔记旨在帮助初学者快速掌握JavaScript的核心概念和技术,实现从入门到精通的过渡。 1. **基础语法** - 变量声明:JavaScript支持var、let和const关键字声明变量,理解它们的作用域和提升特性至关重要。 - ...
在学习JavaScript的旅程中,变量及其作用域是核心概念之一。它们是编程中用来存储数据值的命名位置,允许我们引用这些数据值以执行不同的操作。JavaScript中的变量相对自由,没有严格的类型限制,这意味着可以在变量...
本学习笔记将深入探讨JavaScript的核心概念,包括变量、数据类型、操作符、控制流程、函数、对象、数组、原型链、闭包等,并结合实际示例,如my.js、order.js、login.js等文件,来讲解其在实际项目中的应用。...
这份“javascript学习笔记整理知识点整理”是针对初学者的一份宝贵资料,涵盖了JavaScript的基础知识,旨在帮助新手快速入门并掌握这门语言的核心概念。 一、变量与数据类型 在JavaScript中,变量用于存储数据。...
这些只是JavaScript学习笔记的一部分,深入理解并熟练运用这些概念,将为JavaScript编程打下坚实的基础。随着学习的深入,还会接触到更多高级特性和框架,如闭包、原型链、AJAX、jQuery、Vue.js、React.js等,这些都...
例如,以下代码展示了JavaScript的函数作用域: ```javascript function test() { // a scope for(var i = 0; i ; i++) { // not a scope // count } console.log(i); // 10 } ``` 在这个例子中,尽管`for`...
在这篇学习笔记中,我们将深入探讨JavaScript中的数据操作和函数作用域。 首先,我们要明白JavaScript中的数据类型分为基本数据类型(如Number、String、Boolean、Null、Undefined和Symbol)和对象数据类型(如...
- 块作用域:由`let`和`const`声明的变量具有块作用域。 - **闭包**:当一个内层函数访问其外层函数的变量时形成的特殊作用域结构。 #### 四、DOM操作 - **获取元素**: - `document.getElementById()`:通过ID...
"Javascript学习笔记(传智播客视频学习笔记+代码)"是一份全面介绍JavaScript基础知识的学习资源,适用于初学者。这份笔记结合了传智播客的web前端培训视频内容,提供了丰富的理论讲解和实践代码,帮助读者从零开始...
### JavaScript学习笔记知识点详解 #### 一、JavaScript基础篇:数据类型 JavaScript是一种弱类型语言,它具有自动类型转换的特点,使得开发过程中更加灵活但也容易出现类型错误。本节主要介绍JavaScript中的基本...
JavaScript学习笔记——深入理解基础与函数 在JavaScript中,学习基础知识是至关重要的,因为它是所有进一步编程技巧的基础。首先,我们需要了解JavaScript中的数据类型。在JavaScript中,有五种简单的数据类型:...
这篇"JavaScript入门新手学习笔记"提供了全面的学习资源,适合初学者系统性地掌握这一技术。 笔记可能包含了以下关键知识点: 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(如字符串、数字、...
这只是JavaScript学习笔记的一小部分,JavaScript还有更多高级特性和概念,如对象、数组、函数、类、模块、闭包等,以及DOM操作、事件处理、Ajax异步请求等内容,需要进一步深入学习和实践才能掌握。
这个“javaScript学习笔记.rar”压缩包显然包含了作者在学习JavaScript过程中的心得和记录,对于初学者或者想要深入理解JavaScript的人来说,是一份宝贵的资源。 JavaScript与Java虽然名字相似,但两者实际上是不同...
【狂神说系列 JavaScript笔记】是一份全面且深入的JavaScript学习资源,旨在帮助开发者和初学者深入理解这门广泛应用于Web开发的脚本语言。这份笔记涵盖了JavaScript的基础语法、核心概念以及高级特性,旨在构建一个...