宝哥软件园

Javascript基础回顾(2) js范围

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

本来打算把系列表情的最后一篇文章由浅入深的继续下去,但是最近,团队突然忙起来了,从来没有过!不过喜欢表情的朋友可以放心,写了:)在他们的工作中,我们发现Javascript的一些基本原理普遍存在于这里或那里,所以我们决定花一些时间整理这些基本知识,与大家分享。培训用PPT稍后会附上。刚开始打算写一篇文章,后来写的时候发现越来越多,于是决定写一个系列。本系列的所有内容都与Javascript基础知识有关,但没有什么时髦的东西,但我相信这些基础知识会帮助你理解那些有趣的东西。

Javascript基础复习(1)类型Javascript基础复习(2)范围Javascript基础复习(3)面向对象这是Javascript系列的第二部分,大家一定要知道。我们主要看Javascript中的变量作用域问题。主要涉及以下内容:

参数传递问题作用域和作用域链块级作用域扩展作用域链参数传递的问题是什么

在Javascript中,所有参数都是通过值传递的。也就是说,将函数外部的值复制到函数内部的参数,与将值从一个变量复制到另一个变量是一样的。基本类型值的传递就像基本类型变量的复制,而引用类型值的传递就像引用类型变量的复制。

—— 《Javascript 高级程序设计》第三版

函数addTen(num){ num=10;返回数字;}var计数=20;var结果=addTen(计数);alert(count)//20 alert(result)//30我觉得值类型的传递应该很简单,就不多说了,重点讲一下引用类型的值传递。

函数setName(person){ person . name=' Jesse ';} var person=new Object();setName(人);alert(person . name);//Jesse,这个函数改变我们外部对象的值,和C#一样。因为函数中人物指向的地址和外部人物指向的地址是一样的。以下行为与C#相同,即参数指向函数内容中的另一个对象,不会影响外部对象。

函数setName(person){ person . name=' Jesse ' person=new Object();人名=“另一个杰西”;} var person=new Object();setName(人);alert(person . name);//Jesse给初学者一个关于引用类型的副本的示意图。

将堆中的一个空间分配给person对象,并将堆中person的地址保存在堆栈中。复制堆中人员的地址,并将其提交给人员2(也在堆栈中)。new Person()再次将堆中的一个空间分配给person2对象,然后将堆栈中的person2指向这个新地址。未来对人员2的更改不会影响人员。什么是范围和范围链

我们知道JavaScript中有局部变量和全局变量,一个函数中的局部变量在另一个函数中是无法访问的(暂时还是避免闭包吧)。这就是作用域的作用,因为变量只在它所属的函数中起作用。

每个函数都有自己的执行环境,每个执行环境都有一个与之关联的变量对象。这个环境中的所有变量和函数都存储在这个变量中。除了函数有自己的执行环境之外,我们还有最大的全局执行环境,而众所周知的window就是这个全局执行环境的变量对象,因为所有的全局变量和函数都是作为window的属性和方法创建的。在每个环境中的所有代码都被执行之后,环境就被销毁了,存储在其中的所有变量和函数也被销毁了。对于全局执行环境,如果关闭浏览器或退出页面,全局执行环境将被破坏。

但是我只能访问这个函数中的变量吗?众所周知,有全局变量,可以被任何函数(Javascript没有像public、private、protected这样的关键字)或者任何引入页面的js访问。这就是我们常说的范围链。范围链的作用是确保有序地访问执行环境可以访问的所有变量和函数。为什么说有序参观?让我们看看下面的代码:

var color=' blue函数AlertColor(){ var color=' red ';警报(颜色);} AlertColor();//redalert(颜色);//蓝色众所周知,如果局部变量和全局变量同名,全局变量会被覆盖,但不会被真正覆盖。它们只在当前函数中被覆盖,我们仍然可以在外部正常使用它们。这涉及到对执行环境的有序访问。

作用域链的前端始终是当前执行代码的环境的变量对象,对于我们的alertColor,它是自己的活动对象。所有函数的活动对象都包含一个初始值,这是我们的参数。而范围链的下一个对象,来自于被包容的外部环境,延续到全球环境。所有函数的作用域链都可能延续到全局环境,这就是为什么全局变量在所有函数中都可以被访问,而不是因为它被称为全局变量,所以在所有函数中都可以被访问(:)。此外,全局执行环境的环境变量始终是范围链的最后一个对象。

让我们看一个更复杂的例子:

var color=' bluefunction change COlOr(){ var other COlOr=' red ';函数swapColors(){ var tempColor=other color;anotherColor=colorcolor=tempColor//可以访问color,other color,tempcolor }//只能访问other color swapColors();}//这里只能访问colorchangeColor();在上面的代码中,我们有三个执行环境,全局环境、changeColor的本地执行环境和swapColors的本地执行环境。全局环境中只有一个可变颜色和一个函数changeColor()。changeColor中有一个变量otherColor和一个函数swapColors(),但是它可以访问全局环境中的颜色。swapColors中有一个局部变量tempColor,在changeColor或者全局环境中都不能访问,那么另外两个环境中的所有变量都可以在swapColors中访问,因为另外两个环境是它的父执行环境。

我们可以发现范围链是由内向外延伸的。我们可以通过作用域访问外部环境的变量和函数,但不能在外部环境中访问内部环境的变量和函数。我们在swapColors中使用全局变量color,但它不会一次找到所有颜色,它有一个从内到外的搜索过程:

在当前执行环境中寻找一个名为Color的局部变量,但没有找到,在父执行环境changeColor中寻找一个名为color的变量,但没有找到,在changeColor的父中找到color变量,直接取用。块级作用域由于块级作用域的存在(以花括号为起点),C#中这样的代码无法编译。

静态void Main(字符串[]args){ for(var I=0;i=10i ) {控制台。书写(I);}控制台。书写(I);}我们无法再访问for循环之外的I。但是在Javascript中,情况完全不同。

for(var I=0;i=10I){//}警报(I);//11扩展范围链如上所述,Javascript中只有两种执行环境:全局执行环境和本地执行环境。但是我们可以使用with和try-catch来扩展范围。由于很少有常见的使用场景,让我们以为例。

函数buildUrl() { var qs='?debug=true ';with(location){ var URL=href QS;}返回url}在with的作用下,变量location被添加到作用域的前面,因此location下的所有变量和方法都可以在with的作用域内访问。

这就是我们要谈的。让我们总结一下:

值类型通过值传递,引用类型通过引用传递。传输行业和变量复制行业是一样的。Javascript中有两种执行环境:全局和局部(函数)执行环境中有一个变量对象,它定义了在这个执行环境中可以访问的变量和函数。执行环境可以从内部到外部扩展到全局执行环境。Javascript没有块级作用域。接下来,我们来看看如果Javascript中没有公有、受保护、私有等关键字,如何实现公有和私有的属性。以及如何实现静态类型的变量?不要走开。元旦假期后,我们将继续复习Javascript基础知识的旅程。

更多资讯
游戏推荐
更多+