首页 新闻 会员 周边

JS中的没有块级作用域和局部变量之间的一个问题。

0
悬赏园豆:50 [已解决问题] 解决于 2016-08-25 13:08

JS没有块级作用域,《javascript高级程序设计》比如

if (true){

  var color="blue"

}

alert(color);//"blue"

 

那如果,if语句块中包含一个函数,函数里有一个变量,在跳出if之后是否还会像上面这样可以访问到?比如

 

if (true){

  function(){

  var color="blue"

  }

}

alert(color);//"blue"

buctwbzs的主页 buctwbzs | 初学一级 | 园豆:149
提问于:2016-08-24 20:12
< >
分享
最佳答案
1

  变量分为局部变量和全局变量,在函数内部的局部变量,在函数外部是不会访问到的,第一个if为判断,里面的变量是可以读取出来的。第二个if中包含一个函数(函数写的不对),里面的变量为局部变量,在函数外部是读取不到的。可以把color在函数外部定义,在内服不加'var',这样便可以读取到。

var color = null;

if (true){
   function s(color){
return color = 'blue';
}
var value =s(color);
  }
alert(value);

收获园豆:10
安得浮生半日闲 | 菜鸟二级 |园豆:282 | 2016-08-24 21:03

恩,谢谢您的回答,我知道不加var就变成全局变量了。但是您写的上一段代码是什么意思,var value =s(color);这一句存在的作用是什么?吧函数赋值给一个变量,函数声明?

buctwbzs | 园豆:149 (初学一级) | 2016-08-24 23:30

@buctwbzs: 这一个函数是有返回值的,有返回值的话需要定义一个额外的变量接收,value就是这一个额外定义的变量,s是这个函数的名。

安得浮生半日闲 | 园豆:282 (菜鸟二级) | 2016-08-25 10:27
其他回答(4)
0

第二函数内的var color="blue";这个是局部变量,只能在函数内部引用,出了函数就不可以了,如果在外面也可以使用有两种方法,一个是把函数里的var 去掉;第二方法就是给函数一个返回值,代码:

if (true){

         function color(){

           var color="blue";
            return color

         }

        }

      alert(color());//"blue"

这样就可以了

收获园豆:10
爱吃de馒头 | 园豆:255 (菜鸟二级) | 2016-08-24 21:16

很谢谢您的回答,根据你的回答我有了新的疑问。函数返回值返回到调用它的地方,这个函数在if语句块中,那么外界还能调用这个函数吗?如果不能那么它的返回值返回到哪里?

支持(0) 反对(0) buctwbzs | 园豆:149 (初学一级) | 2016-08-24 23:28

@buctwbzs: 前提是if中的条件是满足的,所以可以运行到这个函数,下面就可以调用了,如果if条件为false,那么就相当于那个if没有执行,也就没有那个函数,外界就调用不了了,返回值就是在调用函数时才会产生。如果不调用,也就没有返回值了。

支持(0) 反对(0) 爱吃de馒头 | 园豆:255 (菜鸟二级) | 2016-08-25 10:27
0

if (true){

  var color="blue"

}

alert(color);//"blue"//没有块级作用域,可以访问if中的变量,if只是起到控制作用

if (true){

  function(){

  var color="blue"

  }

}

alert(color);//"blue"

//这样是访问不到的。function中的变量只在function作用域能访问,可以在方法外定义全局变量或去掉var 

收获园豆:10
长毛象 | 园豆:211 (菜鸟二级) | 2016-08-24 22:46

看到您说的我又联想到了一个东西,如果根据作用域链的话,if是不是function的一个包含环境?当函数变成执行环境的时候,它的包含环境,在这里也就是if是无法访问该执行环境的数据的。我这样理解对吗?

支持(0) 反对(0) buctwbzs | 园豆:149 (初学一级) | 2016-08-24 23:33

@buctwbzs: 我觉得你要是想执行function可以这样做

var fn;
if(4 > 2){
fn = function(){
alert(1);
}
}else{
fn = function(){
alert(2);
}
}
fn();

支持(0) 反对(0) 长毛象 | 园豆:211 (菜鸟二级) | 2016-08-25 13:10
0

如果仅仅是想知道结果,运行一下就行了嘛,当然,如果想知道原理再说。

收获园豆:10
顾晓北 | 园豆:10844 (专家六级) | 2016-08-25 08:43
0

 访问不到,Javascript中用var申明的变量只有函数作用于,没有块级作用域,你申明在一个函数里面,外面当然不能访问到了。

你可以深入看看 Javascript作用于链,这个还是比较重要的,

收获园豆:10
小精灵儿Pawn | 园豆:470 (菜鸟二级) | 2016-08-25 09:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册