说说js作用域

时间:2024-03-24 17:37:26

开始就来说说作用域这个蛋疼的东西。里面可能会出现各种的问题 .先给一个简单的例子大家猜猜结果是什么

var   a="b"; function text(){ alert(a);var a="c";alert(a);} text();    结果就是  a:undefined  a:"c";  为什么第一个a 不是"b"了。这个就要说到函数作用域了。他使用的作用范围我们总结为:函数里面申明的变量是局部的,就只在函数体内部有定义。他们是局部变量,作用域是局部性的。它们只在函数体内部有定义。(注:var a="b"; function text(){ alert(c);var a="c";alert(a);} text();不如说这个你说结果又是什么:结果就是 语法错误 C 没有定义。其实我是这么理解的:又回到上面的那句话了》函数定义的变量值在函数里面才有用:为什么第一个例子会是undefined了。就是js在函数执行之前会把作用域内所有用var声明抽到头部统一生成。这个肯定就是undefined了。)于是我们又会产生一个问题?为什么js没有块级作用域了?我举个列子来说明一下:var a="b"; if(true){ var a="c"; alert(a); } alert(a); 我任务的答案是 a:"c"  a:"b" 可是结果是:a:"c" a:"c" 我产生疑问了这个是为什么?如果有块级作用域,明显if语句将创建局部变量name,并不会修改全局name,可是没有这样,所以Js没有块级作用域。function test(flag){ if(flag){ var a="a"; for(var i=0;i<2;i++) ; } alert(i); alert(a);} test(true);结果:2 "a"  这个应该很好理解吧。现在我们在看看这个例子。function test(flag){ if(flag){  a="a"; for(var i=0;i<2;i++) ; } alert(i);} test(true);alert(a) 答案是什么了。按照我们上面的理解 :应该是  i:"2",a is not defined  为什么是  2 a  去掉了var  他会自动升级为全局变量。下面我们遗留一个问题  function test(flag){ if(flag){  var a="a"; for(var i=0;i<2;i++) ; } alert(i);} test(true);alert(a)  答案又是什么啊??下面这个例子又是什么了???  alert(a);function test(flag){ if(flag){  var a="a"; for(var i=0;i<2;i++) ; } alert(i);} test(true);