• 【转】JavaScript的this


    最近在读Programming Languages Pragmatics的时候又看到了这个,虽然似乎不是什么值得提的事,为了避免忘记还是记下来。

    JavaScript里的this就是被调用对象的引用。形象的说,就是那"."之前的那个对象的引用。
    JavaScript里虽然有函数(类型),也有函数(对象),但在调用的时候总是跟某个对象绑定在一起来调用的。直接调用一个看似没有跟什么对象绑定的函数,实际上是跟"全局"对象绑定在一起了。在浏览器DOM里这个全局对象就是window。
    当使用new运算符来构造新对象时,new之后跟着的那个构造器里的"this"指向的就是由new而构造出来的一个空的新对象。这个对象里暂时什么都还没有(有是有,不过DontEnum看不到罢了),而构造器里的this.xxx形式的赋值就能够创建给那个对象新的属性。

    说到底,JavaScript里的“对象”不过就是关联数组罢了。按Concepts of Programming Languages一书里的讲法,JavaScript里的对象与perl里的hash是很像的。现下流行的JSON也正是利用了这个特性而发展出来的。

    可以看看下面这段代码:
    Js代码 复制代码 收藏代码
    1. <script>   
    2.     function fooConstructor() {   
    3.         this.variable = 1;   
    4.     }   
    5.        
    6.     function makeAnonymousFunction() {   
    7.         return function() {   
    8.             this.gooValue = 2;   
    9.         };   
    10.     }   
    11.        
    12.     fooConstructor();          // invoke a function that looks like a constructor   
    13.     makeAnonymousFunction()(); // invoke an anonymous function   
    14.     document.write(variable + "<br />");   
    15.     document.write(window.gooValue + "<br />");   
    16.        
    17.     var obj = new fooConstructor(); // invoke a constructor with "new"   
    18.     document.write(obj.variable + "<br />");   
    19. </script>   
    20. <!-- displays:   
    21. 1   
    22. 2   
    23. 1   
    24. -->  
    <script>
        function fooConstructor() {
            this.variable = 1;
        }
        
        function makeAnonymousFunction() {
            return function() {
                this.gooValue = 2;
            };
        }
        
        fooConstructor();          // invoke a function that looks like a constructor
        makeAnonymousFunction()(); // invoke an anonymous function
        document.write(variable + "<br />");
        document.write(window.gooValue + "<br />");
        
        var obj = new fooConstructor(); // invoke a constructor with "new"
        document.write(obj.variable + "<br />");
    </script>
    <!-- displays:
    1
    2
    1
    -->


    虽然我们在第一次调用fooConstructor()时并没有以"object.method()"的形式来调用,它实际上等价于window.fooConstructor()。于是我们把window对象(浏览器DOM里的"全局"对象)隐式传给了所调用的函数,在fooConstructor里this就指向了window,并为window对象创建了variable属性,赋值为1。

    makeAnonymousFunction()()的调用是为了演示这个this的指向与嵌套层次的无关性。makeAnonymousFunction()返回了一个函数对象,不过我们没有为这个对象给予一个名字,而是直接调用了它。与前一例一样,这个调用为window对象创建了一个名为gooValue的属性,并赋值为2。

    然后我们演示了以new运算符来创建新对象的状况。这个很普通没什么需要解释的了~
  • 相关阅读:
    Javascript Promise技术
    什么是CPS
    移动端input file 提示没有应用可执行此操作
    黄聪:wordpress+Windows下安装Memcached服务及安装PHP的Memcached扩展
    黄聪:Windows下安装Memcached服务及安装PHP的Memcached扩展
    用VScode配置Python开发环境
    在VSCode中使用码云(Gitee)进行代码管理
    网页链接分享到微信朋友圈带图标和摘要的完美解决方法
    解决百度统计被刷广告的办法,屏蔽非法广告
    Visual Studio代码PHP Intelephense继续显示不必要的错误
  • 原文地址:https://www.cnblogs.com/baron89/p/2665267.html
Copyright © 2020-2023  润新知