zoukankan      html  css  js  c++  java
  • 关于匿名函数,闭包和作用域链

    网上有很多关于javascript作用域链和闭包的解释说明,但大多数都是风格统一的例子解释,看的多了也就烦了,所以以这篇笔记来梳理自己的理解,如果有觉得不对的,希望可以指出,共勉。

    首先说下作用域的问题:

      以线段来比喻作用域的初始状态,原始的作用域链就是一个实心点,代表window这个全局环境,这个就是最原始的执行环境

      如果在window环境下执行,var a = ‘this is window’ 或者 a = 'this is window',那么a这个变量就隶属于window

      因为js中不存在块级语法,所以像条件,循环语句是不能新建一个执行环境的,也就是说下面的定义最后都属于window

      

     1 if(b) {
     2     var c;  
     3 }
     4 
     5 while(d) {
     6     var e;  
     7 }
     8 
     9 for(var f=0; ; ) {
    10     var g;
    11 }

      以上代码不会为因为b和c在if中,所以他们的执行环境变成了,if或者while或者for,他们始终还是属于window

      那什么情况下,会改变代码的执行环境? 那就是函数,也只有函数能新建执行环境,包括一般函数,匿名函数等等,只要是函数,就会自动在当前执行环境下新建一个执行环境。

      

    function b(){
        // code  
    }
    
    function c(){
        // code  
    }
    
    function d(){
        //  e in d
        function e(){
            // code
        }  
    }    

      以上共新建了4个新的执行环境,可以看成四个点,首先按照顺序 点window—— 点b —— 点c —— 点d ,很明确,b,c,d属于window执行环境下,而且都在window之前,中间的——就带表自己的环境域

      点window是看不到点b之前的——(环境域),包括点c和点d的,所以既然看不到也就无法使用,但是,点d却能看到点window的,这就形成了作用域链。

      最后 点e在点d中,所以就是 点d —— 点e 这样的一个关系。

      未完待续。。。

      

  • 相关阅读:
    memset
    无穷大无穷小的表示方法
    堆-STL
    3386 二分图 洛谷luogu [模版]
    jquery——幻灯片(只动一屏)
    jquery——整屏滚动
    jquery——元素节点操作
    jquery——事件冒泡、事件委托
    jquery——解决鼠标移入移出导致盒子不停移动的bug
    jquery——无缝滚动
  • 原文地址:https://www.cnblogs.com/z-Relix/p/3620589.html
Copyright © 2011-2022 走看看