JavaScript学习(二):变量、作用域和内存问题

基本类型和引用类型的值

  基本类型(简单的数据段)

  基本数据类型是按值访问的,因为保存在变量中的是实际的值。

  引用类型(可能由多个值构成的对象)

  引用类型是保存在内存中的对象,JavaScript不允许直接访问内存中的位置。所以实际上是在操作对象的引用而不是实际的对象。

  1.动态的属性

  只能给引用类型值动态的添加属性。

  2.复制变量值

  因为基本类型和引用类型的访问方式不同,在复制变量的时候也会不同。

  当从一个变量向另一个变量赋值基本类型的值的时候,会创建新值,然后把值复制到此位置。

  当从一个变量向另一个变量赋值引用类型的值的时候,创建的新值是一个指向对象的指针,复制的实际上是指针,所以两个值实际上将引用同一个对象。

  3.传递参数

  ECMAScript中所有函数的参数都是按值传递的。

  在向参数传递基本类型的值时,被传递的值会复制给命名参数的局部变量,因此两者互不相关,只是拥有相同的值。

  在向参数传递引用类型的值时,会把这个值在内存中的地址复制给命名参数的局部变量,因此局部变量的变化会反应在函数外部,但不代表它是按引用访问的。

证明如下:

function setName(obj) {
    obj.name = ‘Eric‘;
    obj = new Object();
    obj.name = ‘Cherry‘;
}

var person = new Object();
setName(person);
alert(person.name);     //‘Eric‘

  4.检测类型

  typeof   

  variable instanceof constructor(如果变量是给定引用类型的实例,则返回true)

  注:因为所有的引用类型都是Object实例,所以检测引用类型值和Object构造函数时都会返回true,如果用来检测基本数据类型,始终返回false。

执行环境及作用域

  每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在环境执行完成之后,栈将其环境弹出,把控制权交给之前的执行环境。

  当代码在一个环境中执行时,会创建变量对象的一个作用域链,保证对执行环境有权访问的所有变量和函数的有序访问。

  1.延长作用域链

  当执行流进入到斜面任何一个语句时,作用域链就会得到加长。

  try-catch语句的catch块;  (创建一个新的变量对象,其中包含的是被抛出的错误对象的声明)

  with语句。 (会将指定的对象添加到作用域链中)

  2.没有块级作用域

  条件语句中定义的变量会添加到当前执行环境,而不仅在条件语句内。

  声明变量:使用var声明的变量会添加到最接近的环境中。没有var声明的变量会被添加到全局环境中。

  查询标识符:搜索过程始终从作用域链的最前端开始逐级向后回溯,直至找到标识符为止。

垃圾收集

  1.标记清除

  给存储在内存中的所有变量加上标记,定时清理。

  2.引用计数

  跟踪每个值被引用的次数,引用次数变为0的变量就会有垃圾收集器清理。(但是由于循环引用会导致引用次数永远不会清零,即永远不会回收。)

  3.性能问题

  动态分配触发垃圾回收器的变量分配、字面量、数组元素的临界值。

  4.管理内存

  局部变量在离开它们的执行环境的时候会自动被接触引用。

  而全局变量则不会,最好的方式是数据一旦不再用,手动设置其值为null来释放其引用。

原文地址:https://www.cnblogs.com/FunkyEric/p/9050851.html

时间: 2024-10-02 20:57:29

JavaScript学习(二):变量、作用域和内存问题的相关文章

第一百零六节,JavaScript变量作用域及内存

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈

javascript变量作用域与内存

第四章 变量作用域与内存基本类型 5种Undefined Null Boolean Number String 两种变量类型 基本类型与引用类型注意:String 再其他语言中是引用类型,再javascri中为基本类型即:这五种基本类型是按值访问的 引用类型是按照引用访问的 动态的属性对于一个引用类型,一个引用变量被赋值后,可以为其添加属性,也可以删除与修改其属性var o = new object();o.name = "qi"; //可以为引用变量添加属性 变量的复制基本类型的复制

JavaScript变量作用域和内存问题(二)

执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后台可以看到.     全局变量的执行环境是最外围的执行环境,在web浏览器中,全局执行环境就是window对象,所以所有的函数和全局变量都可以作为window对象的一个属性.其他执行环境都是在函数和变量执行完毕后销毁内存,变量和函数也随之销毁,而全局变量也是在关闭页面或浏览器的时候销毁.    “

JavaScript变量作用域和内存问题(js高级程序设计总结)

1,变量 ECMAScript和JavaScript是等同的吗?个人认为是否定的.我的理解是这样的,ECMAScript是一套完整的标准或者说协议,而JavaScript是在浏览器上实现的一套脚本语言.也就是说,ECMAScript是JavaScript的父类标准.JavaScript是ECMAScript的具体实现.所有ECMAScript定义的数据类型或者语言特性实际上都是伪代码的形式规定的.当然如果可以,ECMAScript也可以有服务器实现,单片机实现(不一定恰当).如果说ECMAScr

第四章 变量作用域和内存问题--笔记6

JavaScript没有块级作用域 使用var声明的变量会自动被添加到最近的环境中,如:在函数内部,最近的环境就是函数的局部环境,在with语句中,最近的环境就函数环境.如果初始化变量时没有使用var,则该变量自动被添加到全局环境. 在某个环境中读取或写入某个标识符时,就会在从作用域链的前端开始逐级向下查找,直至找到即停止搜索.

JavaScript学习杂记--变量

一.作用域:js到底是什么作用域,当然是函数作用域了,我们的浏览器就是一个被实例化的window对象,如果在window下定义一个name字段,那么name字段就具有window这个函数作用域,也就是在window下都是可以访问的,如果在window下定义一个function ctrip,然后里面再定义一个name,那么这个新定义的name只能在ctrip函数下通用,而老的name继续在window下通用 解析器在执行ctrip的时候,第一件事情就是寻找ctrip下的所有局部变量,然后再执行后续

从头开始学JavaScript 笔记(二)——变量及其作用域

一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义:var firstDemo; 二.变量的作用域 2.1基本概念 使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明. 这么说不理解的话可以看看下面这个简单粗暴的例子: test();function test(){var firstDemo="hello";//定义局部变量 alert(firstDemo)

javascript痛点之一变量作用域

1.用var声明的变量是有作用域的,比如我们在函数中用var声明一个变量 1 'use strict'; 2 function num(){ 3 //用var声明一个变量num1 4 var num1 = 15; 5 } 函数中声明了一个变量num1,在js函数中用var声明变量实际上就声明了一个局部变量.局部变量就是在外部访问不到只能在函数内部访问. 1 'use strict'; 2 function num(){ 3 //用var声明一个变量num1 4 var num1 = 15; 5

第四章 变量 作用域和内存问题

4.1变量 变量包含2种类型的值: 基本类型的值: 即undefined,null, string,number,boolean.   按值访问,可以操作保存在变量中实际的值, 不能添加属性. var name = "Nicholas"; name.age = 27; console.log(name.age); //undefined 引用类型的值:多个值构成的对象.JS不允许直接操作对象的内存空间.给一个对象添加属性是,是在实际的对象中添加. 俩种类型值的区别: 1.保存方式不同:

javascript学习(二)

这一章主要是对javascript字符串,数值和日期的操作 一.字符串 1.查找一个字符串,indexOf(),和lastIndexOf() var str="to be ,or not to be"; var a=str.indexOf('to be'); var b=str.lastIndexOf('to be'); document.write("the first to be is in "+a+"<br>"); docume