当前位置: 首页 > news >正文

九、JavaScript作用域、预解析

一、JavaScript作用域

1.JavaScript作用域

①代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突
②js的作用域(es6)之前:全局作用域 局部作用域
③全局作用域:整个script标签 或者是一个单独的js文件

var num = 10;
console.log(num);

④局部作用域(函数作用域)在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用

function fn() {
	// 局部作用域
	var num = 20;
	console.log(num);
}
fn();
2.变量的作用域

根据作用域的不同我们变量分为全局变量和局部变量
①全局变量:在全局作用域下的变量 在全局下都可以使用
注意 如果在函数内部 没有声明直接赋值的变量也属于全局变量⭐⭐⭐
②局部变量 在局部作用域下的变量 后者在函数内部的变量就是 局部变量
注意 函数的形参也可以看作是局部变量
③从执行效率来看全局变量和局部变量
(1) 全局变量 只有浏览器关闭的时候才会销毁,比较占内存资源
(2) 局部变量 当我们程序执行完毕就会销毁

var num = 10;  // num 就是一个全局变量
console.log(num);  // 10

function fn() {
	console.log(num);
}
fn();  // 10

console.log(aru);  // Uncaught ReferenceError: aru is not defined
// 函数的形参也可以看作是局部变量
    
function fun(aru) {
	var num1 = 10;  // num1就是局部变量  只能在函数内部使用
	num2 = 20;  //  如果在函数内部  没有声明直接赋值的变量也属于全局变量
}
fun();
console.log(num1);  // Uncaught ReferenceError: num1 is not defined
console.log(num2);  // 20
3.JavaScript没有块级作用域

现阶段没有,es6 的时候新增的块级作用域
块级作用域 {} if {} for {}
外面是不能调用num的

if (3 < 5) {
	var num = 10;
}
console.log(num);  // 10
4.作用域链

内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值 这种结构我们成为作用域链 就近原则

        var num = 10;
        function fn() {  // 外部函数
            var num = 20;
            function fun() {  // 内部函数
                console.log(num);
            }
            fun();
        }
        fn();  // 20
5.案例
        function f1() {
            var num = 123;
            function f2() {
                console.log(num);  // 站在目标出发,一层一层的往外查找
            }
            f2();
        }
        var num = 456;
        f1();  // 结果为:123
        var a = 1;
        function fn1() {
            var a = 2;
            var b = '22';
            fn2();
            function fn2() {
                var a = 3;
                fn3();
                function fn3() {
                    var a = 4;
                    console.log(a);  // a的值:?4
                    console.log(b);  // b的值:?22                
                }
            }
        }
        fn1();

二、JavaScript预解析

1.js 引擎运行js 分为两步:预解析 代码执行

(1) 预解析 js引擎会把js 里面所有的 var 还有function 提升到当前作用域的最前面
(2) 代码执行 按照代码书写的顺序从上往下执行

2.预解析分为 变量预解析(变量提升)和函数预解析(函数提升)

(1) 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
(2) 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数

        // 1. 报错:Uncaught ReferenceError: num is not defined
        // console.log(num);
        
        // 2. undefined
        console.log(num);
        var num = 10;
        // 相当于执行以下代码
        // var num;
        // console.log(num);
        // num = 10;

        // 3. 11
        fn();
        function fn(){
            console.log(11);
        }

        // 4. 报错:Uncaught TypeError: fun is not a function
        fun();
        var fun = function() {
            console.log(22);
        }
        // 函数表达式  调用必须写在函数表达式下面
        // 相当于执行以下代码
        // var fun;
        // fun();
        // fun = function() {
        //     console.log(22);
        // }
案例

案列1:

        var num = 10;
        fun();
        function fun() {
            console.log(num);
            var num = 20;
        }  // 输出结果:undefined
        // 相当于执行力以下操作
        // var num;
        // function fun() {
        //     var num;
        //     console.log(num);
        //     num = 20;
        // }
        // num = 10;
        // fun();

案列2:

        var num = 10;
        function fn() {
            console.log(num);
            var num = 20;
            console.log(num);
        } 
        fn();  // 输出结果为:undefined 20
        // 相当于执行以下代码
        // var num;
        // function fn() {
        //     var num;
        //     console.log(num);
        //     num = 20;
        //     console.log(num);
        // } 
        // num = 10;
        // fn();

案列3:

        var a = 18;
        f1();
        function f1() {
            var b = 9;
            console.log(a);
            console.log(b);
            var a = '123';
        }   // 输出结果为:undefined 9
        // 相当于执行以下代码
        // var a;
        // function f1() {
        //     var b;
        //     var a;
        //     b = 9;
        //     console.log(a);
        //     console.log(b);
        //     a = '123';
        // } 
        // a = 18;
        // f1();

案列4:⭐⭐⭐⭐⭐

        f1();
        console.log(c);
        console.log(b);
        console.log(a);
        function f1() {
            var a = b = c = 9;  
            // 相当于 var a = 9;  b = 9; c = 9;    b 和 c 直接赋值  没有 var 声明 当 全局变量看
            // 集体声明  var a = 9, b = 9, c = 9;
            // 未用 var 声明,也可以输出赋予的值,但是 声明变量为赋值则输出undefined
            console.log(a);
            console.log(b);
            console.log(c);
        }   // 输出结果为:9  undefinded  undefinded undefinded undefinded 9  
        
        // 相当于执行以下代码
        function f1() {
            var a;
            a = b = c = 9;
            console.log(a);  // 9
            console.log(b);  // 9
            console.log(c);  // 9
        } 
        f1();
        console.log(c);  // 9
        console.log(b);  // 9
        console.log(a);  // 报错:Uncaught ReferenceError: a is not defined

相关文章:

  • 【数据分享】2000—2024年我国乡镇的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)
  • 遇到一个奇怪问题,页面请求不到后端
  • 基于SpringBoot+Vue3实现的宠物领养管理平台功能七
  • 95 克的工业级动能:STONE 80A-M 电调深度测评 —— 无人机动力系统的轻量化范式
  • 跨域问题确认及处理
  • windows10在wsl上利用GPU运行tensorflow 2.12
  • 基于PyCATIA的CATIA实体双侧分割技术实现与优化
  • Onlyoffice 编译打包运行过程优化
  • 基于CNN的FashionMNIST数据集识别4——GoogleNet模型
  • VMware主机换到高配电脑,高版本系统的问题
  • 视图窗口的客户区
  • Android Coil3 Fetcher preload批量Bitmap拼接扁平宽图,Kotlin
  • 【VolView】纯前端实现CT三维重建-CBCT
  • Python中的优化函数5:优化的一些处理技巧
  • 如何选择合适的 AI 模型?(开源 vs 商业 API,应用场景分析)
  • 基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)
  • 从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析
  • 【Linux】快速上手Makeflie CMake
  • 神聖的綫性代數速成例題10. N維矢量綫性運算、矢量由矢量組綫性表示、N個N維矢量相關性質
  • RC5解密工具
  • 6月底将返回中国,旅日大熊猫获颁“感谢状”
  • 上海发文加强直播经济技能人才培养:三年新培养持证直播技能人才5万名
  • 这个死亡率第一的“老年病”,正悄悄逼近年轻人
  • 19世纪的“表征之场”:弗洛伊德的精神分析椅
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠
  • 蒲慕明院士:好的科普应以“质疑、讨论公众关切的科学问题”为切入点