JavaScript——函数作用域

1.作用域:标识符(变量和函数名)在哪些地方能够被访问 那些地方就是这个标识符的作用域。这些地方就是指的函数的代码块内部和函数代码块外部。

规则1:函数内部的代码块可以访问函数内部的标识符,也可以访问函数外部的标识符(副作用)
规则2:函数外部可以访问函数外部的标识符,但是不能访问函数内部的标识符
 通常称函数内部的标识符为局部标识符


                var a = 200
		        function fn(a) {
                    function fm(a) {
                        console.log(a,"第一次") 
                        a = 90
			            console.log(a,"第二次")
                    }
                    fm(a) 
                    console.log(a,"第三次")
		        }
		        fn(a+10) 
		        console.log(a,"第四次") 

 

分析: 首先fn(a+10)的a是到全局变量中找a的值为200,然后fn(a+10)就等价于fn(210);再将a=210传入fn函数,函数fn就有一个隐式操作var a=210;然后再将a=210作为参数传入fm函数,所以第一次打印210;然后再重新给a赋值为90,所以第二次打印90;第三次打印的还是fn中的a,为210;第四次打印的是全局作用域中的a,为200 

 2.函数在运行时,会有一个隐式提升的操作。每一个作用域在运行时,js引擎会先把作用域内部的关键字提前扫描 并声明。但是变量是只提升声明 而不赋值;函数是连同函数体一起提升。

3.函数运行时的隐式提升过程:

1.先隐式提升当前作用域内部的所有形参变量和局部变量(只提升变量 不提升赋值)
2.再把实参赋值给形参变量
3.然后执行函数的隐式提前声明
4.再按照代码顺序运行代码

    var a = 10
    function fn() {
        // 隐式操作:把var修饰的变量提前声明
        // var a
        console.log(a)
        //a打印undefined 是因为a声明了却没赋值
        a = 40  
        //给隐式声明的变量赋值  初始化  a=40
        var a = 20  
        //更新a的值 a = 20
        console.log(a) 
        //打印a为20
    }
    console.log(a) 
    //打印a为10
    fn()
    console.log(a)
    //打印a为10`

4.同名标识符的提升问题:

1.变量和函数同名时  先变量后函数
2.变量和变量同名时  就近访问
3.函数和函数同名时  也是就近访问

5.函数运行时的作用域

函数是一个引用数据,标识符可以在任何作用域去引用一个函数,但是函数运行时的作用域就是函数在生成(定义和声明)时,所在的作用域。也就是说函数运行代码时,一定是去它声明和定义的作用域执行代码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z_小张同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值