【JS】函数作用域、函数提升综合练习

		let a=1//报错,预编译时,funciton a函数提升,a已被声明,此处再let声明报错
		function a(){
			console.log(a)
		}
		
		
		let a = 10;
        function fn(){
            a = 20;
            console.log(a);
        }
        fn();//20
        console.log(a);//20


       let a = 10;
        function fn(){
            let a = 20;
            console.log(a);
        }
        fn();//20
        console.log(a);//10


       let a = 10;
       //因为fn()预编译 且局部变量a提升 a=undefined 往下执行a=20 a=30 打印的a是30
        function fn(){
            a = 20;//此处找到的a是函数内部的局部变量a 对函数外部的a没影响
            var a = 30;//变量提升 此时a已经预编译
            console.log(a);
        }
        fn();//30
        console.log(a);//10


        let a = 10;
        function fn(a){
            a = 20;
            console.log(a);
        }
        fn();//20 没传实参 a=undefined 此处即使传了实参a,let a的值也不会改变,仍是10
        console.log(a);//10


        let a = 10;
        function fn(a){
            console.log(a);//10
            a = 20;//修改形参的值
            console.log(a);//20
        }
        fn(a);
        console.log(a);//10
		
		
		
		/* 1.在函数作用域空间寻找变量a
        /* 2.当函数声明和变量声明同时存在时  函数声明优先于变量声明
        3.非匿名立即执行函数,函数变量是只读的,不能进行赋值
         */
        let a = 10;//此处分号不能少
		(function a(){
			a=20//此处的函数变量a 无法赋值 忽略执行不报错,但严格模式下会报错
			console.log(a)//输出函数a()本身
		})()

		
		
		let f3= ()=>console.log(this)
        f3()//this是window
        let o1 ={
            f3,//执行到此处 f3引用地址和上面定义的f3地址相同,都指向同一个函数对象,即()=>console.log(this)
            test(){
//此处的f3是上面定义的let f3,此处变量f3引用的地址改变了,指向了一个新的函数对象,即()=>console.log('hh')
//f3不在o1对象内部找f3 而是找外部的let f3  因为o1对象内部不算一个函数作用域
                f3 = ()=>console.log('hh')
                f3()
            }
        }
        o1.test()//hh
        f3()//hh
        o1.f3()//this是window
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值