作用域,作用域链,垃圾收集,js解析

变量中包含基本数据类型引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象.

引用类型可以为其添加属性和方法,也可以改变和删除属性和方法.

复制变量值:

基本类型:一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,并把该值分配到新变量分配的位置上,两者任何操作不会互相影响.

引用类型:当一个变量向另一个变量复制引用类型的值时,同样也会存储在变量的值复制一份放到位新变量分配的空间中,但是不同的视,这个值的副本只是一个指针,而这个指针指向存储在堆中的一个对象,两个变量引用一个对象,改变其中一个变量,另一个也会随之改变.

传递参数:

所有函数的参数都是按值传递的.

在向函数的参数传递基本类型值时,被传递的值会被复制给一个局部的变量(命名参数.arguments对象中的一个元素)

在向参数传递引用类型的值时,即使是按值传递,指向的也是同一个对象,因为变量指向的对象在堆内存中只有一个.

typeof操作符是一个确定一个变量是字符中数值,布尔值.undefined的最佳工具,如果变量是null或对象,则会返回object

instanceof操作符是一个确定变量是引用类型的操作符.

instanceof检测引用类型和object构造函数时  return true

instanceof检测基本数据类型值时            return false

作用域:

最外围的作用域为全局作用域,根据宿主环境不同,其表示作用域的对象也不同,未声明的变量皆为全局变量.

除全局作用域以外的所有作用域皆为局部作用域,var声明的变量为局部变量

js中没有块级作用域一说

作用域链:

是由局部作用域中的深层作用域由内向外冒泡寻找,一直到全局作用域.

局部作用域可以访问全局作用域,但是全局作用域不可以访问局部作用域中的变量.

延长作用域链

with()延长作用域链

    实例

var person={};

with(person){

name="xiaoming";

sex="male";

}


基本数据类型

引用数据类型

不可修改

可以修改

保存在栈内存

保存在堆内存,指针地址保存在栈内存中
按值访问
按引用访问

比较时,值相等就相等

比较时,同一引用才相等

复制时,创建一个副本

复制时,,复制的其实只是一个指针

按值传递参数

按值传递参数

用typeof检测类型

用instanceof检测类型

垃圾收集:

js是全自动的,不必像c和c++之类手动收集垃圾,可以让我们少操心了.

js中垃圾收集分为两种,一种是标记清除法,还有一种是引用计数.

标记清除是垃圾收集器在运行的时候会给在内存中的所有变量都打上标记,然后,它会去掉环境中的变量和被环境中变量引用的变量的标记,而在此之后再被添加上标记的变量就被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了,最后完成垃圾收集.

引用计数是跟踪每个值被引用的次数,当声明了一个变量并将一个引用类型值赋给该变量时,该值引用的次数加1,反之减1,为0时,说明无法访问,收回所占用内存.

但是会涉及循环引用的问题,循环引用会导致永远都不会被清理,一直占用内存,可将值设置为null来手动解除引用.

js解析

  1.预解析

    当前作用域var和function关键词的会事先声明(变量提升),函数的优先级比var声明的优先级高,var声明的变量会被提升为undefined,声明函数会把整个函数提升到最前面.

  2.逐行解读

个人理解,欢迎大佬们给提意见!!

原文地址:https://www.cnblogs.com/pitepan/p/11074490.html

时间: 2024-10-09 23:07:56

作用域,作用域链,垃圾收集,js解析的相关文章

JavaScript函数之作用域 / 作用链域 / 预解析

关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ ------------------------------------------------------------------------------------------------------------------------------------------- 作用域 js中作用域只有一种,就是函

js---07 js解析器作用域

js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等号后面的a = 1,所以a的值是未定义,并加入仓库,根据function找到函数后,function a (){ alert(2); },找到函数是函数整体,这是js的预解析(预解析只找var 和函数).遇到重名的留下后面的,变量和函数重名了,函数在后面,只留下函数. 正式读取代码的时候,是从上到下

Javascript 进阶 作用域 作用域链

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25076713 一直觉得Js很强大,由于长期不写js代码,最近刚好温故温故. 1.Javascript没有代码块作用域的概念,局部作用域是针对函数来说的. function fun() { for( var i = 0 ; i < 10 ; i++) {} //如果在Java中i此时应当属于未声明的变量,但是Js中i的作用域依然存在 console.log(i);//10 if(

JavaScript this 局部变量全局变量 作用域 作用域链 闭包

从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 代码段二: var name = "The Window"; var object

JVM内存模型及垃圾收集策略解析

AD: JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Java中的JVM内存模型及垃圾收集的具体策略进行综合的分析. 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文.栈空间随着线程的终止而释放.St

Java虚拟机对象存活标记及垃圾收集算法解析

一.对象存活标记 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 引用计数算法(Reference Counting)的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术.使用ActionScript 3的FlashPlayer.Python语言以及在游戏脚本领域中被广泛应用

js解析emoji表情

Emoji 公司的产品之前只有网页端,并没有提供emoji表情,之后将某个模块整合到app中,里面有个评论功能,在手机端可以输入emoji,显示的时候是空白,说明数据库并没有存储成功,查阅资料后得知emoji是四个字节,而mysql5.5.3前的版本utf8编码最多只支持3个字节. js解析emoji 先需要了解几个概念,js的编码方式.utf16.unicode 1.JavaScript语言采用Unicode字符集,但是只支持一种编码方法ucs-2 2.utf16编码 utf16是ucs-2的

JS解析XML文件和XML字符串

JS解析XML文件 <script type='text/javascript'>    loadXML = function(xmlFile){        var xmlDoc=null;        //判断浏览器的类型        //支持IE浏览器        if(!window.DOMParser && window.ActiveXObject){            var xmlDomVersions = ['MSXML.2.DOMDocument.

js解析xml字符串或xml文件,将其转换为xml对象

注:判断是否是ie浏览器和非ie浏览器的方法有多种,在此只介绍用例中的方法: 1.解析xml字符串,得到xml对象的方式: function createXml(str){ if(document.all){//IE浏览器     var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");        xmlDoc.async = false;     xmlDoc.loadXML(str);     return xmlDoc; } el