读javascript高级编程02-变量作用域

一、 延长作用域链

有些语句可以在作用域前端临时增加一个变量对象,该变量对象在代码执行完成后会被移除。

①with语句延长作用域。

function buildUrl(){
var qs="?debug=true";
  with(location){
  var url=href+qs;
  }
  return url;
}
buildUrl(); //result:http://www.fanxbao.com/?debug=true

②try...catch...中的catch语句块延长作用域链。

function test(){
  try{
      alert(sum); 
  }catch(ex){
    console.log(ex);
  }
}

test();//result:ReferenceError: sum is not defined

二、 没有块级作用域

一般在C类语言中,由花括号封闭的代码块有自己的作用域,其中定义的变量在代码块外部是不可见的。例如在c#中:

private void Test(){
for(int i=0;i<10;i++){
     Console.WriteLine(i);
}
     Console.WriteLine(i);//报错
}

但是,在javascript中却不同,在代码块中创建的变量会将其添加到当前执行环境中。在代码块执行完毕后不会自动销毁。例如:

function test(){
for(var i=0;i<10;i++){
     console.log(i);
}
    console.log(i);//可以执行,结果输出10
}
test();

这里的变量i被添加到全局作用域中,在for循环之后仍可以访问。

三、 匿名函数模仿块级作用域

function test(){
 //匿名函数
  (
function(){ for(var i=0;i<10;i++
){
         console.log(i);
    }
  })();
    console.log(i);//报错:i is not defined
}
test();

其实这个过程就类似于:

function test(){
  var f=function(){
    for(var i=0;i<10;i++){
         console.log(i);
    }
  };
  f();
  console.log(i);//报错:i is not defined
}
test();

四、var声明变量

使用var声明的变量会自动被添加到最接近的执行环境中,比如在函数内部声明的变量执行环境就是函数这个局部环境。但是如果变量声明时没有使用var,则作用域为全局执行环境。例如:

function add(a,b){
  var sum=a+b;
  return sum;
}
var result=add(10,20);
console.log(sum);//执行结果:sum is not defined
function add1(a,b){
  sum=a+b;
  return sum;
}
var result=add1(10,20);
console.log(sum);//执行结果:30

不过这种情况要尽量避免,很容易出现不易发现的错误。

读javascript高级编程02-变量作用域,布布扣,bubuko.com

读javascript高级编程02-变量作用域

上一篇:JAVA获取随机数


下一篇:Java 正则表达式 向前、向后匹配