奇怪的JS-阿里云开发者社区

开发者社区> 开发与运维> 正文

奇怪的JS

简介: 有的时候发现JS是一门很高深的语言,不是我等俗人可以学会,没有private,没有public不说,居然连Class都没有,这个世界就是这样,有的东西你不一定非要想通,也不一定非要剖根问底,有的时候你只需要接受。

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章