首页 > 代码库 > 读javascript高级编程02-变量作用域
读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
不过这种情况要尽量避免,很容易出现不易发现的错误。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。