zoukankan      html  css  js  c++  java
  • 奇怪的JS

    有的时候发现JS是一门很高深的语言,不是我等俗人可以学会,没有private,没有public不说,居然连Class都没有,这个世界就是这样,有的东西你不一定非要想通,也不一定非要剖根问底,有的时候你只需要接受。JS的世界是一个奇怪的世界,变量可以重复定义,this也是一个多变的东西,就连函数也可以有多重角色,我们从下面的例子入手吧,猜猜答案是多少?

       function Animal() {
                this.name = 'Animal';
    
                this.sleep = function (who) {
                    alert(who + "   sleep!!");
                }
            }
            function Dog() {
                Animal.call(this);
    
            }
            function test() {
                var dog = new Dog();
                dog.sleep("dog");
            }
            function ScopeTest() {
    
                this.Add = function (a, b) {
                    fAlert();
                    return a + b;
                };
    
                fAlert = function () {
                alert('bbbb');
                }
    
                
    
            }
            var sCope= new ScopeTest();
            alert(sCope.Add(3, 4));
    
            test();

    JS中最奇怪的就是这个this,我个人认为,因为在C#或者Java中this是始终指向当前的对象的,而JS中的this有的时候指向window,有的时候指向其它对象,有的时候这个this还会被改变,比如上面的代码,当用了call这个函数之后,Animal里面的this就成了dog,这个可以在调试的时候跟踪到:

    JS中的所有方法和变量都属于一个作用域,而上面提到的this是始终指向这个作用域的,作用域其实就是一个范围,而且作用域,是在运行的时候决定的,在JS中因为函数充当了类和对象的作用,因此在不用实例化的时候也是可以运行的,如果未采用new关键字,那么函数中的this指向的就是window,如果采用了new,那么情况就不一样了,一个小片段的测试就可以让我们得出结论:

         var s="Hell0"
            function same() {
                 var s="Hello!"
                alert(this.s);
                alert(window.s)
                if (this === window) {
                alert("the same");
                }
    
        }
        same();
        var fSame = new same();
        

    现在看下fSame函数执行的时候this.s弹出undefined,为什么不是函数内部定义的var s="Hell哦!"的值呢?这个就和JS有关了,因为在JS中函数是不能在外部读取内部的以var开始的变量的的值的,如果加上this,那就又不一样了。

            var s="Hell0"
            function same() {
                this. s="Hello!"
                alert(this.s);
                alert(window.s)
                if (this === window) {
                alert("the same");
                }
    
        }
          var fSame = new same();

    下面这个代码片段的结果又是多少呢?

      <script type="text/javascript">
                 var name = "liu";
                 function callName() {
                     alert(name);
                     var name = "yu";
                 }
                 callName();

    Javascript在进入一个函数域时,就已经声明好了函数里面需要用到的所有临时变量,注意,仅仅是声明,并没有执行赋值,每个变量的初始值都是undefined,赋值是在执行的时候做的,JS是按照顺序从上到下执行,因此这个弹出undefined的结果,也就解释的清楚了。

    JS中各种奇怪,这些奇怪,让我经常陷入陷阱之中,要想理解的深刻,那就自己给自己挖几个陷阱然后跳进去,然后慢慢的爬出来,通过模拟,通过跟踪,通过调试,也许就能拨开云雾见太阳。

  • 相关阅读:
    Java中的Throwable类是不是受查异常?
    win10下写sh脚本出现^M字符的解决方法
    spring security中Authority、Role的区别
    idea调试框架时如何能够进入maven依赖包的源码
    推荐一个程序员阅读文章资料时的辅助神器
    MySQL添加、修改、撤销用户数据库操作权限的一些记录
    AndroidStudio布局编辑器强制刷新布局界面
    Android Stadio导入Android工程项目,只有Edit Configurations的解决办法
    GitHub克隆下载代码速度慢解决办法
    python各种类型日期转换大全
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/3386288.html
Copyright © 2011-2022 走看看