JavaScript变量,作用域和变量问题(个人整理)
一:变量:基本类型值和引用类型值。
1:基本类型值:undefined,null,boolean,number,string。不能为其值添加属性。
2:引用类型值:按引用访问。可以添加和删除属性和方法。
(二):复制变量值
1:复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。这两个变量是可以参与任何操作而不会相互影响的。
2:复制引用类型的值,两个变量实际上引用的是同一个对象。因此,改变其中一个变量,就会影响另一个变量。
var obj1=new Object(); var obj2=obj1; obj1.name='aa'; alert(obj2.name); //'aa'
(三):传递参数
1:所有函数的参数都是按值传递的。(假如是按引用传递的话,count的值会变成30,从而反映函数内部的修改)
function addTen(num) {
num += 10;
return num;
}
var count = 20
var result = addTen(count);
alert(count); //20,没有变化,因为参数是按值传递。
alert(result); //30
(四):检测类型
1:typeof检测基本数据类型
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //Boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object
2:instanceof检测引用类型(在检测一个引用类型值和object构造函数时,返回true;检测基本数据类型返回false)。
二:执行环境及作用域
1:变量对象:每个执行环境都有一个环境变量,在这个环境中定义的所有变量和函数都保存在这个对象中。
2:全局执行环境是最外围的一个执行环境。某个执行环境中的所有代码执行完毕后,保存在其中的变量和函数也被销毁(全局执行环境在网页关闭等操作后销毁)。
3:活动对象:最开始只包含一个变量,即arguments对象(在全局执行环境中不存在)。
4:内部环境可以通过作用域链访问所有的外部环境,但是外部环境不可以访问内部环境中的所有变量和函数。(可向上,不可向下)
(一):延迟作用域
1:try-catch语句的catch块。
2:with语句。
(二):没有块级作用域
1:if语句和for语句的{}内部的变量会存在循环外部的执行环境中。
2:使用var声明的变量会自动添加到最近 的环境中。在with语句中 ,最接近的环境是函数环境。
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = add(10, 20); //30
alert(sum); //sum是局部变量,会报错。
3:没有使用var声明的变量,会被添加到全局执行环境中。
function add(num1, num2) {
sum = num1 + num2; //sum为全局变量
return sum;
}
var result = add(10, 20); //30
alert(sum); //30
4:查询标识符:向上查询,现在局部环境,向上直到全局执行环境,全局中也没找到则该变量未定义。
var color = "blue";
function getColor(){
var color = "red";
return color;
}
alert(getColor()); //"red"
var color = "blue"; //只能使用window.color调用
function getColor(){
return color; //现在局部环境找color,没找到向全局环境中找.
}
alert(getColor()); //"blue"
三:垃圾收集
1:标记清除(最常用)。
2:管理内存:解除引用:将其值设置为null。

浙公网安备 33010602011771号