JS没有块级作用域,《javascript高级程序设计》比如
if (true){
var color="blue"
}
alert(color);//"blue"
那如果,if语句块中包含一个函数,函数里有一个变量,在跳出if之后是否还会像上面这样可以访问到?比如
if (true){
function(){
var color="blue"
}
}
alert(color);//"blue"
变量分为局部变量和全局变量,在函数内部的局部变量,在函数外部是不会访问到的,第一个if为判断,里面的变量是可以读取出来的。第二个if中包含一个函数(函数写的不对),里面的变量为局部变量,在函数外部是读取不到的。可以把color在函数外部定义,在内服不加'var',这样便可以读取到。
var color = null;
if (true){
function s(color){
return color = 'blue';
}
var value =s(color);
}
alert(value);
恩,谢谢您的回答,我知道不加var就变成全局变量了。但是您写的上一段代码是什么意思,var value =s(color);这一句存在的作用是什么?吧函数赋值给一个变量,函数声明?
@buctwbzs: 这一个函数是有返回值的,有返回值的话需要定义一个额外的变量接收,value就是这一个额外定义的变量,s是这个函数的名。
第二函数内的var color="blue";这个是局部变量,只能在函数内部引用,出了函数就不可以了,如果在外面也可以使用有两种方法,一个是把函数里的var 去掉;第二方法就是给函数一个返回值,代码:
if (true){
function color(){
var color="blue";
return color
}
}
alert(color());//"blue"
这样就可以了
很谢谢您的回答,根据你的回答我有了新的疑问。函数返回值返回到调用它的地方,这个函数在if语句块中,那么外界还能调用这个函数吗?如果不能那么它的返回值返回到哪里?
@buctwbzs: 前提是if中的条件是满足的,所以可以运行到这个函数,下面就可以调用了,如果if条件为false,那么就相当于那个if没有执行,也就没有那个函数,外界就调用不了了,返回值就是在调用函数时才会产生。如果不调用,也就没有返回值了。
if (true){
var color="blue"
}
alert(color);//"blue"//没有块级作用域,可以访问if中的变量,if只是起到控制作用
if (true){
function(){
var color="blue"
}
}
alert(color);//"blue"
//这样是访问不到的。function中的变量只在function作用域能访问,可以在方法外定义全局变量或去掉var
看到您说的我又联想到了一个东西,如果根据作用域链的话,if是不是function的一个包含环境?当函数变成执行环境的时候,它的包含环境,在这里也就是if是无法访问该执行环境的数据的。我这样理解对吗?
@buctwbzs: 我觉得你要是想执行function可以这样做
var fn;
if(4 > 2){
fn = function(){
alert(1);
}
}else{
fn = function(){
alert(2);
}
}
fn();
如果仅仅是想知道结果,运行一下就行了嘛,当然,如果想知道原理再说。
访问不到,Javascript中用var申明的变量只有函数作用于,没有块级作用域,你申明在一个函数里面,外面当然不能访问到了。
你可以深入看看 Javascript作用于链,这个还是比较重要的,