JavaScript作用域

一.作用域的概念

1.javaScript 作用域 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性     更重要的是减少命名冲突

2. 全局作用域 : 整个script 标签 或者是一个单独的js文件

  <script>
var num=10;
    console.log(num);

 </script>

3.局部作用域 在函数内部就是局部作用域 这个代码的名字只在函数内部起效果作用

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

二.变量作用域

根据作用域的不同分为全局变量 和局部变量

1.全局变量 在全局作用域下的变量

注意 如果在函数内部没有声明 直接赋值的变量也属于全局变量

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

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

 2.局部变量 在局部作用域下的变量  后者在函数内部的变量就是 局部变量

注意 函数的形参也可以看做是局部变量

function fun(aru){
    var num1=10;//num1 就是局部变量  只能在函数内部使用
    num2=20;
}
fun();
console.log(num2);

3.从效率来看全局变量和局部变量

 (1)全局变量 只有在浏览器关闭的时候才会销毁 ,比较占内存资源

(2)局部变量 在我们程序执行完毕就会销毁  ,比较节约内存资源

三.作用域链

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

案例:

   // 案例1:结果是几
        function f1(){
            var num = 123;
            function f2(){
                console.log(num);//站在目标出发,一层一层的往外查找
            }
            f2();
        }
        var num = 456;
        f1();//123

// 案例2
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();

四.预解析

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

    (1)预解析 js引擎会把js里面所有的var 还有function  提升到当前作用域的最前面

   (2)代码执行  按照代码书写的顺序从上往下执行

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

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

    (2)函数提升  就是把所有的函数声明提升到当前作用域的前面 不调用函数

我们用案例来解释:

//案例1
        var  num=10;
        fun();

        function fun(){
            console.log(num);
            var num=20;
        }
        // 相当于执行了下方操作  先看外层 变量提升 和函数提升  在看里面 变量提升和函数提升
        // 变量提升 就是 定义变量 不赋值   函数提升就是把声明提到调用前面
        // var num;
        // function fun(){
        //     var num;
        //     console.log(num);
        //     var num=20;
        // }
        // num=10;
        // fun();
// 案例2
var num=10;
function fn(){
    console.log(num);//undefined
    var num =20;
    console.log(num);//20
}

fn();
// 相当于执行以下代码
// var num;
// function fn(){
//     var num;
//     console.log(num);
//     num=20;
//     console.log(num);
// }
// num=10;
// fun()
// 案例3
var a=18;
f1();
function f1(){
    var b=9;
    console.log(a);
    console.log(b);
    var a="123";
}
//相当于以下代码
// var a;
// function f1(){
//     var b;
//     var a;
//     b=9;
//     console.log(a);
//     console.log(b);
//     a="123";
     
// }
// a=18;
// f1();//undefind 9
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声明 当 全局变量
    //
    console.log(a);
    console.log(b);
    console.log(c);
}

// 相当于执行以下代码
// 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);//报错

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值