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

九、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

http://www.kler.cn/a/593600.html

相关文章:

  • 2025年高校辅导员考试题库及答案
  • numpy学习笔记9:numpy的广播机制详细解释
  • 【Transformer】架构:解锁自然语言处理的无限可能
  • 关于金融开发领域的一些专业知识总结
  • 第十三章,L2TP VPN
  • XSS漏洞靶场练习
  • 成都国际数字影像产业园,文创产业运营新典范深度解析​
  • win10 如何用我的笔记本 接网线 远程控制 台式机
  • Python个人学习笔记(17):模块(sys、picklejson)
  • 4.6--入门知识扫盲,路径追踪与路由误导:Tracert攻击 vs ICMP重定向攻击(包你看一遍全记住)
  • iPaaS集成平台中的API可视化编排能给企业带来什么作用
  • Bilve 搭建手册
  • 解析Collections工具类主要功能
  • Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.
  • PyTorch分布式训练中各节点如何通信
  • 第1次课枚举算法
  • Ubuntu 软件仓库管理概述与基本原理
  • PCL—passThrough 点云直通滤波器
  • 阿根廷主流收单方式:Rapipago支付
  • 复盘的力量:如何通过复盘提升项目管理水平