关于局部作用域(块级作用域)
学js的时候遇到的这个,记录一下
javascript
里面没有块级作用域,php
也没有java
,c++
是有块级作用域的
什么是块级作用域
public static void main(String[] args) {
int outer = 0;
//以下是一个块级作用域
for (int i = 0;i < 10;i++)
{
int inner = i;
outer += inner;
}
//以上的部分(括号内和for)是一个块级作用域
System.out.println(outer);
System.out.println(inner);
System.out.println(i);
}
这个随便的代码(java代码)为例,这里的大括号内部就是一个块级作用域,在里面声明的变量外面不能用。就比如这段里,for循环结束了变量inner就没了。
在大括号外调用这个inner将无法运行(编译器用的intelliJ)
for ( var i = 0 ; i < 4 ; i++){
var inner = i;
}
document.write("inner is " + inner +"<br>");
document.write("i is " + i);
//可以正常运行
^这是测试效果,是可以运行而不会报错的
- 所以我们发现,js中一个函数里声明的变量在整个函数中都是可以访问的,这也是为什么js中有
闭包
来避免不必要的问题
一个js中相关的问题
es6中引入了let,也可以用来声明变量。
虽然js没有块级作用域,但是js中let
是有块级作用域的
就比如:
{
var inner1 = 'yoyoyo';
let inner2 = 'check it now'
}
console.log(inner1);
console.log(inner2);
这个就会报错。
函数作用域和局部作用域 (js为例)
- 在这里多一句嘴,函数作用域和局部作用域是不一样的。不管是有没有局部作用域(块作用域)的语言里,函数外部都是不能访问函数内部声明的变量的。
var a = 'FUDAN';
function testScope() {
//会显示undefined,并不能访问到函数外的声明
document.write(a + '<br>');
for(var i = 0 ; i < 4 ; i++){
var a = i;
var b = i;
}
//a可以调用,因为不存在块级作用域
document.write("a is now " + a + "<br>");
}
testScope();
//不会报错,但是访问到的是最前面函数外声明的变量值
document.write(a + "<br>");
//会报错,无法访问函数内部声明的变量b
try { document.write(b)}
catch (e) { document.write("oops! error occurred") }
^再次用js举一个例子
^效果