简单地讨论Javascript中的变量、范围和内存问题

简单地讨论Javascript中的变量、范围和内存问题
{变量}
{ 1 }定义:变量量,相当于给出不定数量的数据。变量是存储信息的容器。

{ 2 }特性:js中的变量是松散类型的,可以保存任何类型的数据。它只是用于在给定时间保存特定值的名称。因为没有规则定义什么类型的数据值必须为变量保存,变量的值及其数据类型可以在脚本的生命周期中更改。

{ 3 }:变量可以在变量声明语句中赋值,而不是其他操作,比如++,=等等。
var a = 2;是正确
var a = 2; / 是错误
var a = 2 + +;是错误的,++只能用于变量,不能使用常量。
{ 4 }注:采用VaR算子定义的变量可以在定义变量的范围局部变量。如果省略变量运算符,你可以创建一个全局变量,但referenceerror误差将被严格的模式

{ 5 } var:用VaR声明的变量将自动添加到最近的环境中。如果变量初始化时未使用var声明,则变量会自动添加到全局环境中。在严格模式下,初始化未声明的变量会导致错误。

{ 6 }局部变量:如果同一名称的识别存在于当地的环境,在母体环境的标识符不使用。后宣布位于局部变颜色不window.color访问全局颜色可变的任何代码

{标识符}
{ 1 }定义函数的变量、函数、属性参数的名称。

{ 2 }音符:

{ 2.1 }的第一个字符必须是字母表、下划线或美元符号。其他字符可以是字母、下划线、美元符号或数字{不能加下划线}。

{ 2.2 }标识符中的字母还可以包括扩展的ASCII或Unicode字母字符,它们可以用在汉语中。

{ 2.3 }标识符应该是小驼峰格式,第一种格式应该是数据类型,常见符号如下:

数组的数组aitems
布尔值布尔biscomplete B
浮点数F浮动价格
函数fn功能fnhandler
我iitemcount整数整数
客体对象odiv1
正则表达式正则表达式reemailcheck重新
字符串的字符串susername
变量变异vanything
{ 2.4 }不能使用关键字、保留字、true、false和null作为标识符。

{ 2.5 }属性不符合标识符的命名规则,如背景颜色,背景颜色应该写成括号{ }

{ 3 }标识符解析:标识符解析是在操作链的第一级和级别上搜索标识符的过程。搜索过程总是从范围链的前端开始,然后一步一步向后倒退直到找到标识符为止。如果找不到标识符,则不声明标识符,通常会导致错误。

{ 3.1 }如果本地环境中有同名标识符,则使用父环境中的标识符。

例如具有全局和本地标识符颜色。该局部变量声明在任何颜色代码可以不使用window.color访问全局颜色变。

{ { 3.2 } Javascript引擎在优化标识符查询方面做得很好。访问全局变量和局部变量的时间差异可以忽略。

{ }(也称为执行环境)
{注意} Javascript中没有块级范围

{ 1 }执行环境:执行环境定义了变量或函数有权访问的其他数据,并确定它们各自的行为。每个执行环境都有一个与之相关联的变量对象。
{ 2 }全局执行环境:

{ 2.1 }全局执行环境是最边远的执行环境中,全局执行环境被认为是在Web浏览器窗口对象,所以所有的全局变量和函数创建的窗口对象的属性和方法。全局执行环境将在应用程序退出破坏,如关闭网页或者一个浏览器

{ 2.2 }一个页面相当于一个全局范围,无论是页面中的JS代码还是引用的外部js文件,它最终都会在页面中按顺序进行分析。
{ 3 }功能执行环境:每个函数都有自己的执行环境。当执行流进入一个函数时,该函数的环境被推入一个环境堆栈中,并且在执行该函数之后,堆栈弹出它的环境,并将控制权返回给以前的执行环境。
{ 4 }范围链:当代码在一个环境中执行,一系列的可变对象范围是创造。一个作用域链的功能是所有的变量和函数有权访问的执行环境,一个有序的访问。范围的前端是可变对象的环境在代码执行。如果这个环境是一个函数,它的活动对象作为变量的对象,主动对象包含在开始的时候,这仅仅是一个变量,参数对象(该对象不在全球环境存在)。在一个作用域链的下一个变量对象来自包含环境,和下一个变量对象来自下夹杂在环境。是的,它继续到全局执行环境;全局执行环境中的变量对象始终是范围链中的最后一个对象。
的{ 4.1 }范围链的特点是:内部环境可以通过作用域链访问所有的外部环境,但外部环境无法访问内部环境中的任何变量和函数。这些环境之间的联系是线性的、有序的。每一个环境可以搜索范围链上查询变量和函数的名字,但没有环境可以通过搜索范围缩小到另一个环境去执行链。
{ 5 }延长行动链:
{ 5.1 }尝试catch语句:catch块创建一个新的变量对象,其中包含抛出错误对象的声明

{带语句的{ 5.2 }:指定的对象将被添加到范围链中
功能buildurl(){
VaR QS = 'debug = true;
带有(位置){
var url =链接+ QS;
}
返回的URL;
}

{垃圾收集}:Javascript有一个自动垃圾收集机制,执行环境负责管理代码执行过程中使用的内存
{ 1 }垃圾收集机制:找出不再使用的变量,然后释放占用的内存。垃圾收集器根据代码执行的固定时间间隔或预定的收集时间周期性地执行此操作。
{ 2 }垃圾回收的两种策略来标记无用变量
{ 2.1 }标记清除,标记进入环境并离开环境。超出范围的值将自动标记为可回收,因此将在垃圾回收过程中删除

{ 2.2 }引用计数和跟踪的次数,每值参考。在声明变量和引用类型的值赋给变量,引用的值是1,如果相同的值赋给另一个变量的相反的参考值的1倍,如果包括在这个价值和参考变量,另一个是参考值,减去1的数,当参考值是0,那么就没有办法访问这个值,所以它可以回收后占用的内存空间

2.2.1 } {引用计数问题:循环引用:对象包含一个指向对象B,对象B也包含一个指针指向对象A.

在{ }即一些对象:2.2.2 IE不是原生js对象,例如,在BOM和DOM对象是COM的形式在C++的形式来实现,而在COM对象的垃圾收集机制采用引用计数的策略。
VaR元= document.getelementbyid('some_element);
VaR MyObject =新的对象();
myobject.element =元;
element.someobject = MyObject;
解决方案:为了避免类似的循环引用,最好在不使用时手动断开连接

myobject.element = null;

element.someobject = null;

为了解决这个问题,IE9将两BOM和DOM对象变成真正的JS对象

{内存管理}
{ 1 }的主要问题是,可用的内存分配给Web浏览器的数量通常小于分配给桌面应用程序,以便防止JS从所有系统内存,导致系统崩溃的疲惫奔跑的目的。内部约束不仅影响内存分配给变量,而且语句可以在一个线程同时执行数。
{ 2 }优化:为执行中的代码保存必要的数据。一旦数据不再有用,最好通过将其值设置为null(称为阿德引用)释放其引用。此方法适用于全局变量和全局对象的大多数属性,以及循环引用变量。当离开执行环境时,本地变量将自动删除。
引用某个变量的释放并不意味着自动回收由该值占用的内存。阿德引用的真正作用是将值保留在执行环境中,以便在下一次运行时回收垃圾收集器。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部