关于js作用域的一个小问题,实在搞不明白了
<!DOCTYPE>
<html>
<head>
<title> New Document </title>
</head>
<body>
<script>
function foo(){var a=2;bar()};
function bar(){console.log(a)};
foo()
</script>
</body>
</html>
js这段代码会报 这个错误 Uncaught ReferenceError: a is not defined, 解决方法到是有很多,但是不明白为什么会报错; 请各位达人们,给出一个比较透彻的解释
20 回复
但是改成这样的话,确是可以运行,就是把bar函数放到foo的作用域里面去声明
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<script>
function foo(){
var a=2;
function bar(){console.log(a)}
bar();
};
foo()
</script>
</body>
</html>
@elrrrrrrr 但是通过闭包就可以访问到啊,代码如下
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<script>
function foo(){
var a=2;
return function(){
console.log(a)
}
};
foo()()
</script>
</body>
</html>
@anotherWill 我把代码改一下,把bar函数声明改到foo函数里面, 注意这会儿,#在打印a的方法中没有定义a(不知道我这句话有没有理解错误); 看代码;
<!DOCTYPE>
<html>
<head>
<title> New Document </title>
</head>
<body>
<script>
function foo(){
var a = 10;
function bar(){
console.log(a)
}
bar()
};
foo()
</script>
</body>
</html>
此时是可以打印的
@eyblog 刚才突发奇想,按照我理解的你的思路,bar()是访问不到,foo里面 var a=10 的; 所以把代码小小改动了一下,这下又出现个困惑了, 万望解答,代码如下:在全局定义一个a;然后在foo函数里面给a赋值;此时bar可以访问到a
<!DOCTYPE>
<html>
<head>
<title> New Document </title>
</head>
<body>
<script>
var a;
function foo(){
a=1000;
bar()
};
function bar(){
console.log(a)
}
foo()
</script>
</body>
</html>
@clm1100 按ES5说,js只有函数作用域,也就是函数可直接访问其外面定义的变量,外面不能直接访问函数内定义的变量;即使闭包也不违背这句话。
var a;//函数外,相当于window.a,对foo和bar均可见
function foo(){
a = 1000;//即window.a = 1000;
bar();
}
function bar(){
console.log(a);//即 console.log(window.a)
}
foo();//根据变量可见范围去追踪理解每一步执行的过程