function test(){
for(var i=0;i<3;i++){
var what = "haha";
} console.log(what);
}
test();
上面这个打印what可以出来haha
function enen(){
var that = "lala";
}
console.log(that);
这个则打印不出来,显示that未定义
疑问:
that是放在enen()函数里面的,外部不可访问我理解。
what不也是放在 test()函数里面的吗?难道what外层加了个for循环,就不算包含在test()里面了?
关于第一个函数: console.log(what); 语句访问what变量,此时what虽然在for循环里面,但是它们在同一个作用域里面啊(test函数对应的作用域)。
关于第二个函数: what在enen作用域里,而console.log(what)访问的what是从enen作用域外检索的,所以检索不到,结果未定义咯。
如果第一个函数按照下面方式写,打印出的what也是未定义:
最后,纠正下@Carlis_Liu的一句描述: js能划分作用域的只有function 。 这是不正确的,开辟作用域的还有 with、try....catch等
后面那个that的作用域只在他function内部
js能划分作用域的只有function,块级作用域指的是定义在条件或循环分支中的,像你举的这个函数例子,test定义在for循环之内,再for循环之外也能访问what变量 (这是js的变量提升,可以查一下,它会把what提升到test函数的最开头定义)
function test(){
如果你这段代码换成Java的,是下面这样的:
private void test(){
String what =“123";
}
System.out.println(what);
❵
这个方法是编译不通过的,因为what的作用域只在for循环之内,为块级作用域。
js有一种东西叫函数作用域
你在test函数内部定义的what变量,然后在test函数内部访问,当然能访问到