零基础学JavaScript—作用域和预解析

本文介绍了JavaScript中的作用域概念,包括全局作用域和局部作用域,强调了作用域在减少命名冲突和提高程序可靠性上的重要性。此外,详细讨论了变量作用域的全局变量与局部变量,以及它们的区别。作用域链则描述了内部函数如何访问外部函数变量的过程。最后,文章深入讲解了预解析阶段,包括变量和函数的提升,并提供了相关案例进行说明。
摘要由CSDN通过智能技术生成

1.作用域

作用域是什么:就是代码名字在某个范围内起的作用和效果

作用域的目的:是为了提高程序的可靠性,更重要是减少命名冲突


2.作用域的分类

2.1 全局作用域

  • 整个script标签 或一个单独的JS文件
<script>

var num = 10 ;  /这个变量就处于‘全局作用域’之中的

</script>

2.2 局部作用域(函数作用域)

  • 在函数内部就是局部作用域,这个代码的名字值在函数内部起效果
<script>

function fn () {
   var num = 20;/函数体处于函数内部的函数作用域,只在函数内部起效果。
}

</script>

3.变量的作用域

3.1 全局变量

在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)

  • 全局变量在全局作用域的任何位置都可以使用
  • 在全局作用域下var声明的变量是全局变量
  • 注意:在函数内不使用var声明的变量也是全局变量(不建议使用)
<script>

var num = 10 ; / num就是一个全局变量 

</script>

3.2 局部变量

在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量

  • 局部变量只能在该函数内部使用
  • 在函数内部var声明的变量是局部变量
  • 函数的形参实际上就是局部变量
<script>

function fn () {
   var num = 20;/函数体处于函数内部的函数作用域,只在函数内部起效果。
       num2 = 10; /未声明的变量也属于全局变量
}

</script>

3.3 全局变量和局部变量的区别

  • 全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
  • 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间

4.作用域链

作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取那个值,之中结构我们称作为作用域链(就近原则)

        var num = 10;

        function fn() { /外部函数作用域
            var num = 10;

            function fun() { /内部函数作用域
                console.log(num); /最里层的函数作用域取值方式为就近原则
            }
        }

5.预解析

JavaScript代码是有浏览器中JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行

什么是预解析:JS引擎会把JS里面所有的声明变量var和声明函数function提升到当前作用域                           的最前面

什么是代码执行:按照代码书写的顺序从上往下执行

 5.1变量预解析(变量提升)

就是把所有的变量声明提升到当前作用域的最前面

5.2函数预解析(函数提升)

就是把所有的函数声明提升到当前作用域的最前面

5.3案例

        var num = 10;         /预解析前

        function fn() {
            console.log(num);
            var num = 20;
            console.log(num);
        }
        fn();
------------------------------------------
        var num;              /预解析后

        function fn() {
            var num
            console.log(num);   /结果是报错
            num = 20;
            console.log(num);   /结果是20    
        }
        num = 10;
        fn();
f1();                 /预解析前
console.log(a);
console.log(b);
console.log(c);

function f1(){
    var a=b=c=9;
    console.log(a);
    console.log(b);
    console.log(c);
}

---------------------------------

function f1()[        /预解析前
    var a;
    a = b =  c = 9;   /a处于函数作用域、b=9 c=9 未声明,处于全局作用域
    console.log(a);   /结果是9
    console.log(b);   /结果是9
    console.log(c);   /结果是9
]

f1();
console.log(a);       /结果是报错
console.log(b);       /结果是9
console.log(c);       /结果是9

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值