js变量、范围和内存详细解决方案

js变量、范围和内存详细解决方案
基本类型值是未定义的、空的、布尔的、数字和字符串。这些类型分别在内存中占据一个固定大小的空间,它们的值存储在堆栈空间中。我们按价值访问它们。

(1)值类型:值、布尔值、空值、未定义的值。

(2)引用类型:对象、数组、函数

如果引用类型的值是指定的值必须被分配在堆内存中此值。因为这价值的大小是不固定的(对象有很多属性方法),不能将它们保存到堆栈的内存,但内存地址的大小是固定的,所以内存地址可以保存在栈内存。
var =新的(对象);创建引用类型
var=;基本值是字符串类型。
box.age = 23; / /基本价值类型添加属性很奇怪,因为只有对象添加属性。
警报(框.年龄);不是引用类型,无法输出;

简言之,堆内存保存引用值,堆栈内存保存一个固定类型值。
var =新对象();
man.name =杰克;
VaR的人=人; / /人获得了指导解决

警报(男名); / /两会弹出杰克
警戒(人名);
复制的变量值

请看下面的例子。
var =新对象();
man.name =杰克;
VaR的人=人; / /人获得了指导解决人

man2.name =明; / /因为他们都指向相同的对象,相同的名字,不管是谁,我们修改修改。
警报(男名); / /两会弹出明
警戒(人名);
从上面可以得出结论:在变量复制方面,基本类型和引用类型也不同。复制的基本类型是值本身,而复制的引用类型是地址。

传递参数

在ECMAscript,所有的函数的参数是按值传递。
函数框(努姆){通过值传递
数字= 10;
返回num;
}

var = 10;
var =框(努姆);
警报(结果);如果它是通过引用传递的,那么函数中的数字将类似于一个全局变量,外部号替换
警报(努姆);也就是说,最后一个(这里应该输出20个输出10)
Javascript不是通过引用传递的,如果引用被传递,函数中的变量将是一个全局变量,可以在外部访问,但这显然是不可能的。

环境和范围的实施

执行环境是Javascript中最重要的概念之一,而执行环境定义了一个变量或函数,该变量或函数有权访问其他数据。

全局执行环境是最外围的执行环境。在Web浏览器中,全局执行环境是窗口对象。因此,全局变量的所有函数都是作为窗口的属性和方法创建的。
var;定义全局变量。
功能setName(){
返回trigkit4 ;
}

警报(窗口名称);最外围的全局变量,属于窗口属性。
警报((窗口。集名称)); / /在外围,全局函数,属于窗口的方法
在执行环境中执行代码后,环境被破坏,变量和函数也被销毁。如果是全局环境,则必须执行或完成所有程序

删除var的局部变量
var;
功能setName(){
名称=trigkit4 ; / /删除变量为全局变量
}

setName();
警报(名称); / /流行trigkit4
通过传递引用,它也是一个局部变量。
var;
功能集名称(name){ / /通过参数和局部变量
警报(名称);
}

集名称(trigkit4 ); / /流行trigkit4
警报(名称);杰克
该函数也包含在函数中,只有这个函数才能访问内层的功能。
var;
功能setName(){
该函数设置年份范围(){ / /设置年份()方法在setName()
返回21;
}
}
警报((设置年份)); / /无法访问错误

可以通过以下方法访问它:
var;
功能setName(){
该函数设置年份范围(){ / /设置年份()方法在setName()
返回21;
}
返回设置年份();
}
警报((集名称)); / /流行21

范围的另一个例子:
var;
功能setName(){
该函数设置年份范围(){ / /设置年份()方法在setName()
var b =你好; / /变量b的范围内设置年份(中)
返回21;
}
警报(b);无法访问
}

当代码在一个环境中执行时,它将形成一个称为作用域的事物链,其目的是确保执行环境中的变量和函数的有序访问(指访问级别按照规则),前面的范围链,是执行环境变量的对象。

行动范围

当变量不在函数语句或语句不功是一个全局变量,在全球范围内,该窗口对象的所有的属性有一个全球范围;在任何地方都可以访问的代码,里面的函数声明和变量修改变量局部变量只能用在身体的功能,虽然有没有函数参数VaR的使用却仍然是一个局部变量。

没有一块表

没有一块表
if语句:
if(true)if if语句的括号没有作用域的函数。

VaR箱=trigkit4 ;
}
警报(箱); / /流行trigkit4

for循环语句也是如此。

查询变量

在对变量的查询中,对局部变量的访问比全局变量快,因此不需要向上搜索范围链。

以下示例如下:
var;
功能setName(){
变量名=trigkit4 ;
返回名称;从下向上搜索
}
警报(setName());

记忆问题

Javascript有一个自动垃圾收集机制,一旦不再使用数据,它可以被设置为null以释放引用。

循环引用

一个非常简单的例子:一个DOM对象被一个Javascript对象引用,同时它引用相同或其他Javascript对象。此DOM对象可能会导致内存泄漏。当停止脚本时,垃圾回收器的引用不会被垃圾回收器回收。要销毁循环引用,对DOM元素的引用或对DOM对象的引用需要分配为null。

关闭

当外部变量的闭包引入闭包时,闭包关闭时对象不能循环(GC)。
var =函数(){()
VaR largeStr =新的阵列(1000000)加入(x);
返回函数(){
返回largeStr;
}
(});
DOM泄漏

当原始COM被删除,不删除的子节点参考,无法恢复
选择= document.queryselector VaR;
无功treeref =选择(#树);

/ / leafref在COM树子节点treefre
无功leafref =选择(#叶);
VaR的身体=选择('body);

Body.removeChild(treeref);

/ / #树不能偿还,因为treeref仍在
/解决方案:
treeref = null;

/ /树不能被回收,因为在leafref树叶的结果。
leafref = null;

#树可以释放 / /现在。

计时器(固定)时间泄漏

计时器也是内存泄漏的常见场所。
对于(var i = 0;i < 90000;i + +){
无功buggyobject = { {
CallAgain:函数(){
var =;
VaR值= setTimeout(function()){
Ref.callAgain();
},90000);
}
}

BuggyObject.callAgain();
虽然您希望,但计时器仍在恢复中。
buggyobject = null;
}

调试内存

Chrome自己的内存调试器可以很容易地查看内存使用情况和内存泄漏情况。

在时间轴>内存点击记录:
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部