• 基础理解: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,所以。。。

  • 相关阅读:
    Asp.net mvc 2 in action 笔记1 概述、Model
    持续集成(CI) 基础
    WCF Service的一些参考资源
    Flash Builder4.5 + BladeDS + Java 集成实例
    .net GC知识点滴
    Silverlight的工具推荐
    php异常处理技术,顶级异常处理器
    【转】理解MySQL——索引与优化
    Zend_Controller的工作流程
    PHP set_error_handler() 函数
  • 原文地址:https://www.cnblogs.com/Believeme/p/5589519.html
Copyright © 2020-2023  润新知