作用域和作用域链

作用域

作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。

局部作用域

变量在函数内声明,变量为局部作用域。

全局变量

一般在window对象中定义的变量为全局变量(自己的认为)。

局部变量

一般在函数内部定义的变量为局部变量。

1.函数外面定义的变量拥有全局作用域

		var a = 1;
        function fun1(){
            var a = 2;
            console.log(a);    //2
            return a;
            console.log(a);    //不执行
        } 
        console.log(fun1());  //2
        console.log(a);       //1

运行结果:
在这里插入图片描述

2.未定义直接赋值的变量自动声明为拥有全局作用域

 		var a = 1;
        function fun1(){
            a = 2;
            console.log(a);    //2
            return a;
            console.log(a);    //不执行
        } 
        console.log(fun1());  //2
        console.log(a);       //2

运行结果:
在这里插入图片描述

作用域链

我个人认为就是全局作用域中定义了函数,那么函数有作为一个局部作用域,函数中也可以嵌套定义函数,那么又有一个小作用域,那么这就是作用域链。但是函数中嵌套定义函数,存在闭包问题,这里先不说,后面会对闭包进行说明。

1.当执行函数时,总是先从函数内部找寻局部变量。
2.如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(声明函数的作用域)寻找,依次向上。

运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行的对应的执行上下文都是独一无二的,所以每次调用函数就会创建多次执行上下文,当函数执行完时,它所产生的执行上下文被销毁。
**

作用域链举例

		function fn(){} 
        var a = 1;
        fn();
        //a 定义时产生的作用域链  --->0 : GO{}
        //a 调用时。。。         --->0 : AO{}
        //                      --->0 : GO{}

		function fn(){
            function fn1(){

            }
            fn1();
        } 
        fn();
        //fn 定义时产生的作用域链  --->0 : GO{}
        
        //fn 调用时。。。         --->0 : fn的AO{}
        //                      --->1 : GO{}

        //fn1 定义时产生的作用域链  --->0 : GO{}
        //                        --->1 : fn的AO{}

        //fn1 调用时产生的作用域链  --->0 : fn1的AO{}
        //                        --->1 : fn的AO{}
        //                        --->2 : GO{}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值