美文网首页
JavaScript变量、作用域和内存问题

JavaScript变量、作用域和内存问题

作者: dongwenbo | 来源:发表于2017-01-13 11:42 被阅读7次

JavaScript类型松散,值和类型都可以改变

基本类型和引用类型的值

ECMAScript变量包括基本类型和引用类型,基本类型是简单的数据段,引用类型是由多个值组成的对象

  • 基本类型:UndefinedNullBooleanStringNumber
    基本类型是值类型,变量名表示值,操作变量就是操作值
  • 引用类型:Object
    引用类型的值是保存在内存中的对象,操作对象通过引用名操作(变量名为引用名),按引用访问
动态属性

引用类型可以动态的添加和删除属性和方法

var person = new Object();
person.name = "xiaoming";
alert(person.name);
复制变量值

基本类型和引用类型在复制时表现不同(其实都是值复制,引用中保持着对象的地址,再复制一个引用。只不过我们通常说引用类型的值是内存中的那个对象)

var num1 = 10;
var num2 = num2;

num1num2 都是独立的10这个值,不会相互影响

var person1 = new Object();
var person2 = person1;
person1.name = "xiaohong";
alert(person1.name);

person1person2都保存着同一个对象的引用,但是引用名是相互独立的,引用所指向的对象是同一个。

传递参数

给函数传递参数和上面所讲的复制变量值是一样的

检测类型

typeof适合用来检测基本数据类型,检测对象只会返回object,我们通常不是想要object,而是想要更加具体的对象,使用instanceof

var person1 = new Object();
alert(person1 instanceof Object);
alert([] instanceof Array);

所有引用类型都是Object的实例,instanceof都会返回trueinstanceof在对象的父类上都会返回true

执行环境和作用域

执行环境(execution context),又称上下文,每个执行环境都有与之对应的变量对象,环境中的所有变量和函数都保存在这个变量对象中,我们用代码无法访问这个变量对象。

全局执行环境是最顶层的执行环境,宿主不同,全局执行环境的变量对象也不同,浏览器中是window,全局执行环境中所有全局变量和函数都是作为window的属性和方法创建的。执行环境中所有代码执行完毕后,环境被销毁,全局环境在关闭网页或者浏览器时被销毁。

执行环境链是一个栈结构,进入函数,函数执行环境压栈,函数执行完毕,出栈。

下级执行环境可以访问所有上级环境中的变量

var name = "xiaoming";
function changName() {
    if (name === "xiaoming"){
        name = "xiaohong";
    }else {
        name = "xiaoming";
    }}
changName();
alert(name);

changName执行环境中可以访问全局变量name
下级执行环境中有同名属性和方法时,优先使用下级环境

延长作用域链

暂时没看懂

没有块级作用域

JavaScript中没有块级作用域,只有全局和局部(函数)

if(true){
    var name = "xiaoming";
}
alert(name);

name在全局执行环境中
for循环中的控制变量也是在全局执行环境中

for(var i = 0;i <= 10;i++){
    console.log(i)
}
alert(i)
声明变量

使用var声明的变量会自动添加到最接近的执行环境中,如果没有使用var关键字,会被添加到全局环境。

function test() {
    name = "xiaoming";
}
test();//在调用之后才会声明name
alert(name);

如果直接使用一个未声明过的变量,直接报错

查询标识符

从当前环境开始向上查询

垃圾回收

自动垃圾回收,在固定的时间间隔周期性地执行。
垃圾回收有两种方式,包括标记清除引用计数
标记清除有性能问题,引用计数有循环引用问题
具体不做探讨了

相关文章

网友评论

      本文标题:JavaScript变量、作用域和内存问题

      本文链接:https://www.haomeiwen.com/subject/ajnjbttx.html