JS 全局作用域 函数作用域

变量作用域

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中没有块级作用域,但是可以用闭包实现类似功能。

猜你喜欢

转载自blog.csdn.net/weixin_40929263/article/details/108024275