作用域,作用域链,闭包题

浏览器有读js的解析器,从script标签开始解析:

  1. 第1步--预解析,找到全局的var和function,var的变量的值设置undefind ,function函数名和内容会整体保存为字符串,变量名和函数名重名时保留函数(既有内容的),函数和函数重名时后面的字符串覆盖前面的字符串
  2. 第2步--逐行读代码,变量在赋值之前一直是undefind,除非读到=、+、-、*、/、%、++、--、!等表达式,而逐行读到函数时则什么都不会做,直到函数被调用才会执行其内容代码

例1.第一步:预解析:把undefined赋给var,解析function;第二步:逐行读代码:到调用函数时,遇到私有的var,开始预解析;

var a=1;
    function fn1(){
    	alert(a);//undefined
    	var a=2;
    }
    fn1();
    alert(a);//1

例2.

    var a=1;
    function fn1(){
        alert(a);//1
        a=2;
    }
    fn1();
    alert(a);//2

例3.

     var a=1;       //参数就是局部变量a-->var a
    function fn1(a){
        alert(a);//undefined
        a=2;
    } 
    fn1();
    alert(a);//2

例4.作用域链:在一个域内没有找到某变量时,会由里到外,自上到下去更高级的域中去寻找,再改一下后分析:

    var a=1;
    function fn1(){
        alert(a);//1
        a=2;
    }
    fn1(a);
    alert(a);//2

例5.函数内的var定义一个局部变量,没有办法从外面找到函数里面的东西,如:

function fn1(){var a = 'abc';} //在全局里a找不到

如果想要获取函数里的内容的可以用全局变量储存:

    var str = '';
    function fn1(){
        var a = 'abc'; 
        str = a;
    }
    fn1();   
    alert(str);

还可以使用局部函数调用的方法:

    function fn1(){
        var a = 'abc';  
        fn2(a);
    }
    function fn2(str){
        alert(str); 
    }

例6.f2被包在函数f1内部,f1内的所有局部变量对f2都是可见的,f2内的局部变量对f1就是不可见了

function f1(){
    	var n=999;
        function f2(){
        	alert(n); 
        }
        f2();// 999
    }
    f1();

例7.既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗,如:

function f1(){
    	var n=999;
    	function f2(){
        	alert(n);
        } 
        return f2;
    }
    var result=f1(); 
    result(); // 999

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值