• javascript-词法作用域规则-作用域链-闭包运用学习心得


    虽然在平时貌似,很习以为常的一些用法但是真要弄清这几个概念的时候,确实费了很大功夫,现在虽然不能说明白但总算有了一些心得。好吧下面直接开始

    注本文(*)为相关链接

    例子1.1

    词法作用域规则:函数的嵌套关系是定义时决定的,而非调用时决定的,即词法作用域,即嵌套关系是由词法分析时确定的,而运行时决定。

    (*)http://blog.csdn.net/zzulp/article/details/8144520

    (*)http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html

    (*)http://www.jb51.net/article/24101.htm

     1 var oa=3;
     2 
     3 function a()
     4 {
     5     var oa = 2;
     6     return b();
     7     function b()
     8     {
     9         return function()
    10         {
    11             return oa;
    12         };
    13     }
    14 }
    15 alert(a()());//=>2

    因为 11行 return oa 在定义时候是在a()函数的作用域内,并且在执行到 这里的时候 oa 会在 作用域链 产生的 活动对象 寻找 如果没有找到 就会往下 寻找一直找到 全局变量,但是这里a()函数有重新定义oa 所以

    优先找到了 <2>.

    1.2

     1 var oa=3;
     2 
     3 function a()
     4 {
     5     var oa = 2;
     6     return b();
     7     function b()
     8     {
     9         return function()
    10         {
    11             return this.oa;
    12         };
    13     }
    14 }
    15 alert(a()());//=>3

    这里的this.oa 被返回出去 (个人见解:this.oa 被认为是某一个对象下的属性,在作用域链中只有当搜索到 全局对象的时候 oa 是window下的一个属性 所以成立)

    1.3

     1 var oa=3;
     2 
     3 function a()
     4 {
     5     var oa = 2;
     6     return b();
     7     function b()
     8     {
     9         return oa;
    10     }
    11 }
    12 alert(a());//=>2

    1.4

     1 var oa=3;
     2 
     3 function a()
     4 {
     5     var oa = 2;
     6     return b();
     7     function b()
     8     {
     9         return this.oa;
    10     }
    11 }
    12 alert(a());//=>3

    例子2.1

    (*)http://www.w3school.com.cn/js/pro_js_object_scope.asp

    (*)http://blog.cnbang.net/tech/2025/

     1  var oa=3;
     2  var a = {
     3      oa : 2,
     4      b : function()
     5      {
     6         return function()
     7          {
     8          return oa;
     9          };
    10      }
    11  };
    12 alert(a.b()());//=>3

     这里的oa(个人理解是 :首先这个oa不是a的属性, 且oa没有声明 var 所以直接返回的 就是全局变量,为了证明这一点 我在这个函数内部 声明了 var oa;尝试 结构返回 undefined)

    2.2

     1  var oa=3;
     2  var a = {
     3      oa : 2,
     4      b : function()
     5      {
     6         return function()
     7          {
     8          return this.oa;
     9          };
    10      }
    11  };
    12 alert(a.b()());//=>3

     (个人理解是 :因为当 return this.oa 的时候 this指向了 window,我尝试在 这个方法和这个方法的外层添加 a.oa=10;但是 依然返回3,貌似这里并没有产生作用域的关系,但是

    再次做尝试 将11行改为 return a.oa =>2;说明这里有作用链的关系 只是 当this返回出去的时候 应该是产生了新的作用域链 所以this的指向发生了变化 指向了window

    2.3

    1  var oa=3;
    2  var a = {
    3      oa : 2,
    4      b : function()
    5      {
    6          return this.oa;
    7      }
    8  };
    9 alert(a.b());//=>2

     在这个例子里面 返回了a的b方法 所以this指向了 a

    2.4

    1  var oa=3;
    2  var a = {
    3      oa : 2,
    4      b : function()
    5      {
    6          return oa;
    7      }
    8  };
    9 alert(a.b());//=>3

     直接返回全局变量

     

  • 相关阅读:
    上传到dockerhub
    ILSpycmd 手册
    自制防丢纽扣:防airtag
    备忘:MIP算法
    Python学习笔记:select_dtypes选取指定数据类型的列
    Python学习笔记:LGB/XGB/CatBoost/NGB之安装
    Python学习笔记:dataframe行遍历之iterrows
    Python学习笔记:数据框dataframe列反转
    PHP获取汉字首字母并分组排序 何苦
    mysql 批量更新(插入)表字段 清洗数据 存储过程 何苦
  • 原文地址:https://www.cnblogs.com/VanqusherCsn/p/4206266.html
Copyright © 2020-2023  润新知