js的作用域学习笔记

今天看了js的作用域的知识,感觉收益匪浅,首先对于js的作用域,在程序执行的时候,有一句话一定要理解那就是

js函数运行在他定义时的作用域,而不是他们被执行的作用域里。

这句话一定要理解,下面来看个例子

function factory(){
            var name = "laruence";
            var intro = function  () {
                alert("I am "+name);
            }
            return intro;
        }   
        function app (para) {
            var name = para;
            var func = factory();
            func();
        }
        app("eve");

然后我们来看看作用域链,当调用app的时候,scope chain是由{window活动全局对象}-》{app的活动对象}组成。
在刚进入app函数的函数体的时候,app活动对象有一个arguments属性,两个值为undefined属性:name和func和一个值为“eve”的属性para,此时的scope chain如下:

    [[scope chain]] = [
    {
         para : 'eve',
         name : undefined,
         func : undefined,
         arguments : []
    }, {
         window call object
    }
    ]

当进入factory的函数体的时候。此时sfactory的scope chain为

    [[scope chain]] = [
    {
         name : undefined,
         intor : undefined
    }, {
         window call object
    }
    ]

注意到,此时的作用域链并不包含app的活动对象,在定义intro函数的时候,intro函数的scope chain为

    [[scope chain]] = [
    {
         name : 'laruence',
         intor : undefined
    }, {
         window call object
    }
    ]

从factory函数返回之后,在app体内调用了intor的时候,发生了标识符解析,scope chain为

    [[scope chain]] = [
    {
         intro call object
    }, {
         name : 'laruence',
         intor : undefined
    }, {
         window call object
    }
    ]

因为scope chain中并不包含factory对象,所以name属性包含的是factory中活动的name属性,也就是’laruence’.

I am laruence

现在大家对函数是运行在定义时的作用域,而不是运行他们被执行的作用域里应该有个全面的了解。

js里的预编译

js里面其实是有一个预编译的过程的,这里有两个要点:
1.声明式的函数会被预编译。
看下面这个例子:

  <script>
     alert(typeof eve); //function
          function eve() {
               alert('I am Laruence');
          };
     </script>

alert出来是有值的

    <script>
         alert(typeof eve); //结果:function
         alert(typeof walle); //结果:undefined
         function eve() { //函数定义式
              alert('I am Laruence');
         };
         var walle = function() { //函数表达式
         }
         alert(typeof walle); //结果:function
    </script>

看这个walle就是未定义的。
2.函数是分块进行编译,但是共享变量等。
看这个例子:

    <script>
         alert(typeof eve); //结果:undefined
    </script>
    <script>
         function eve() {
              alert('I am Laruence');
         }
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值