JavaScript高级程序设计学习笔记--变量、作用域和内存问题

时间:2022-02-09 06:31:12

传递参数

function setName(obj){
obj.name="Nicholas";
obj=new object();
obj.name="Greg";
}
var person=new Object();
setName(person);
alert(person.name); //"Nicholas"

在函数体内重新new一个Object,并将它赋值为"Greg",但在函数外部访问name属性时,其值仍为"Nicholas".实际上,当函数内部重写obj时,这个变量引用的就是一个局部对象了。
而这个局部对象会在函数执行完毕后立即销毁。

检测类型

如果变量的值是一个对象或null,则typeof操作符会像下面例子中所示的那样返回"object";

var n=null;
var o=new object();
alert(typeof n); //object
alert(typeof o); //object

延长作用域链

当执行流进入下列任何一个语句时,作用域链就会得到加长:
try-catch 语句的catch块
with语句

function buildUrl(){
var qs="?debug=true";
with(location){
var url=href+gs;
}
return url;
}

在此,with语句接收的是location对象,因此其变量对象中就包含了location对象的所有属性和方法。

没有块级作用域

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

如果是在C,C++或是JAVA中,color会在if语句执行完毕后被销毁,但在javascript中,if语句的变量声明会将变量添加到当前的执行环境。在使用for语句时尤其要牢记这一差异,如:

for(int i=0;i<10;i++){
doSomething();
}
alert(i); //