zoukankan      html  css  js  c++  java
  • 基础理解:3作用域作用域链

    javascript的作用域和作用域链是我学习最痛苦的一部分,因为我花了好多时间看了好多技术文档都没有理解.大体知道什么意思了,然后还说不出之所以然来.

    通过我大量的测试和看技术文档总结了以下理解,虽然不是很有技术范但是确实能理解了。

       

       

    1、javascript只有全局和局部之分,那些后台语言的各种修饰符都没有。在函数中不使用var则为全局。如下:

       

    <script type="text/javascript">

    varname="c#";//全局

    window.name="java";//全局

    var language=function()

    {

    alert(name);

    name="javascript";//全局

    var name="JS";//局部

    alert(name);

    return name;

    }()

       

    alert(name);

    </script>

       

    上面代码中表示为全局的在都指向同一个变量,下面的定义会替换上面的。关于三个alert分别是underfind,js,javascript.这就是作用域起了作用了。

       

    2、作用域链从0级开始依次往下排,所谓的依次往下排指的是子级的排列。在寻找变量的时候先从同级找再找父级。

       

    在上面的例子中,

    首先弹出的是language后面匿名方法里的第一个alert,如果window全局是0,那么在例子中var name="js"这个就是1.第一个alert就在1中找,如果找不到在去0中找。这是它发现了同级有一个var name="js"但是它目前还没有赋值,所以弹出underfind

    第二个弹出是language后面匿名方法里的第二个alert,同样的他会在1里找也就是方法内部。他找到了name而且赋值了js,所以弹出的是js

    第三个弹出是最下面的alert,由于在方法内部已经给全局name重新赋值了,导致弹出的是javascript。

       

       

    然后增加下一个链路我们在language中顶一个方法,如下:

       

    <scripttype="text/javascript">

    varname="javascript";//全局

    window.name="javascript";//全局

    varlanguage=function()

    {

    alert(name);

    name="javascript";//全局

    varname="JS";//局部

    alert(name);

       

    var lovelanguage=function(){

    alert(name);

    return name;

    }();

    }()

       

    alert(name);

    </script>

       

    此时lovelanguage后面匿名方法里的alert弹出的是js因为他会找上一级也就是language里的name,所以。。。

  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/Believeme/p/5589519.html
Copyright © 2011-2022 走看看