JavaScript变量和作用域(3)

x33g5p2x  于2021-08-23 转载在 JavaScript  
字(1.6k)|赞(0)|评价(0)|浏览(443)

4.1 基本类型和引用类型

JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间;实际上是在操作对象的引用而不是实际的对象;

动态属性

对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法

var person = new Object();
// 给对象person添加属性age
person.age = 18;
alert(person.age)

变量值复制

var num1 = 5;
var num2 = num1;

将num1的值传递给num2;num2 与 num1 的地址完全独立,操作互不影响;

如果是引用变量则指向同一个地址,改变其中一个变量会影响另一个变量的值;

var person = new Object();
person.age = 18;
var human = person;
human.age = 20;
// 20
alert(person.age)

传递参数

ECMAScript 中所有函数的参数都是按值传递;函数的参数是基本类型与外部变量毫无关系;

如果参数是引用类型,在函数内部修改对象的属性会对外部的变量对象起作用,但是将变量重新赋值则不起作用;

function setAge(person) {
    person.age = 10;
    //person = new Object();
    //person.age = 20;
    //alert(human.age)
}
var person = new Object();
setAge(person)
alert(person.age)

类型检测

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

instanceof 会检测到引用类型返回true,检测到基本类型返回 false

var person = new Object();
var num = 10;
// true
alert(person instanceof Object);
// false
alert(num instanceof Object);

4.2执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为;每个执行环境都有一个
与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中

在 Web 浏览器中,全局执行环境被认为是 window 对象

每个函数都有自己的执行环境

unction getAge() {
            var age = 10;
        }
var person = new Object();

window

getAge

age

person

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

对 with 语句来说,会将指定的对象添加到作用域链中。对 catch 语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明

没有块级作用域

if (true) {
var color = "blue";
}
alert(color); //"blue"

使用 var 声明的变量会自动被添加到最接近的环境中,如果初始化变量时没有使用 var 声明,该变量会自
动被添加到全局环境

局部变量与全局变量同名,需要在函数内部使用window.variable 才可以调用到全局变量;原因是搜索过程自下而上进行搜索;

var age = 20;
function getAge(person) {
    var age = 10;
    // 10
    alert(age);
    // 20 
    alert(window.age);
}
getAge();

getage()

age(函数内部)

age(全局)

window

4.3 垃圾收集

标记清除;进入环境时标记,离开环境时标记;

引用计数;引用次数 - 取值次数 = 0;存在循环引用问题,可以手动对变量置 null解决;

4.4 内存管理

对于全局变量,如果不使用了可以使用置null方法进行解除引用,以便于垃圾回收器下次将其回收;

相关文章