变量作用域
function fun() {
var a = 123;
}
fun();
console.log(a);
//ReferenceError: a is not defined
//函数外无法调用函数内变量
JS中两种作用域:
1、全局作用域
- 直接编写在JS的script标签中的
- 全局作用域在页面打开时创建,在页面关闭时销毁
- 有一个全局对象window,代表一个浏览器窗口,由浏览器创建,我们可以直接使用
- 全局作用域中 创建的变量都作为window对象的属性保存
- 全局作用域中 创建的函数都作为window对象的方法保存
- 全局作用域中的变量是全局变量,页面任意部分都可以调用
//变量都作为window对象的属性
<script>
var a = 10;
console.log(window.a); //浏览器窗口的控制台输出 10
</script>
//函数都作为window对象的方法
<script>
function fun(){
console.log("nihao");
}
window.fun();
</script>
2、函数作用域
- 调用函数时创建函数作用域,函数执行完毕后被销毁
- 每调用一次函数就会创建一个新的函数作用域,他们之间相互独立
- 函数作用域可以访问全局作用域中变量 ,全局无法访问函数作用域中变量
- 在函数作用域中操作变量时,先在自身作用域中寻找,如果没有,则向上一级作用域中寻找,直到全局作用域,全局作用域中也没有,报错。
- 在函数中想要访问全局作用域中的变量(自身也有同名变量),可以使用window,变量名调用
(1)
var a = 20;
function as(){
console.log(a)
}
as(); // a = 20
(2)
var a = 20;
function as(){
var a = 10
console.log(a) // a = 10
}
(3)函数作用域中也有声明提前的特性,使用var 关键字生命的变量,在函数所有代码执行前被声明
function as(){
console.log(a) // a 提前被声明,单位被赋值 ,undefined
var a = 10
}
区别:
function as(){
console.log(a) // a 内层没有找外层 ,a=10
}
var a = 10;
这种情况等同于
var a = 10;
function as(){
console.log(a) // a 内层没有找外层 ,a=10
}
function as(){
console.log(a) // undefined
var a = 10
}
var a = 20;
as();
(4)函数声明在函数所有代码执行前被声明
(5)局部输出找外层
(6)全局中
(7)
(8)
(9)
(10)
3、块级作用域
概念“{}”中间的部分都是块级作用域ex: for while if ,
js中没有块级作用域,但是可以用闭包实现类似功能。