zoukankan      html  css  js  c++  java
  • js(面试第2天)_谈谈对this的理解

    1、说明:this对象在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,当函数被作为某个对象的方法调用时,this等于那个对象,不过匿名函数的执行环境具有全局性,因此this通常指向window

    2、下面是几种常见的情况

      (1)this指向window

    <script type="text/javascript">
    //在全局变量中定义的函数this指向window
            var a = 123
            function test(){
                console.log(this)
            }
            test()//winndow
    </script>

      (2)在构造函数中this指向实例化对象

      情况一:

      var a = 'window';
            function test(){
           
                alert(this.a);
            }
            test();  //window---------这里调用全局中的函数,自然是指向window
    
            var t = new test();  //---------这里是将test()作为一个构造函数,
            alert(t.a);// undefined undefined 

      情况二:

    var a = 'window';
            function test(){
                this.a = a;   //window赋给当前构造函数的属性a
                alert(this.a);
            }
            test();  //window
            var t = new test();
            alert(t.a);//window window

      (3)对象中的this就是指向当前对象,节点也是对象,

     var obj = {
    
                 name:'xxm',
                 age:18,
                 sayHi:function(){
                     alert(this.name)
                 }
             }
            obj.sayHi()//xxm --------this指向当前对象

      (4)注意匿名函数的this对象指向window

     var name = "This window"
            var obj = {
                name:"my obj",
                getNameFun:function(){
                    return function(){//这是匿名函数
                        return this.name
                    }
                }
            }
    
            alert(obj.getNameFun()())//调用匿名函数---window

       解决:

     var name = "This window"
            var obj = {
                name:"my obj",
                getNameFun:function(){
                    var that = this
                    return function(){//这是匿名函数
                        return that.name
                    }
                }
            }
    
            alert(obj.getNameFun()())//调用匿名函数---window

     

    (5)call()和apply()方法可以改变this的指向

      情况一:apply和call方法中如果没有传入参数,或者是传入的是null,那么调用该方法的函数对象中的this就是默认的window

    <script type="text/javascript">
             function f1(x,y) {
             console.log("结果是:"+(x+y)+this);
              return "10000";
            }
              f1(10,20);//函数的调用
    
              f1.apply(null,[100,200]);
              f1.call(null,100,200);
        </script>

      情况二:传入参数,那么this就是当前传入的对象

    function f1(x,y) {
         console.log("这个函数是window对象的一个方法:"+(x+y)+this.sex);
       }
       window.f1(10,20);//---------30 undefined
       //obj是一个对象
       var obj={
          age:10,
         sex:"男"
            
            };
    
        window.f1.apply(obj,[10,20]);// 30-男
        window.f1.call(obj,10,20);//30-男
        console.dir(obj);
        </script>

    3、总结

    调用形式this指向
    普通函数 window
    构造函数 实例化后的对象
    对象的方法 该对象
    DOM节点 该节点对象
    call或者apply 第一个参数
    虽然现在走得很慢,但不会一直这么慢
  • 相关阅读:
    WPF 下两种图片合成或加水印的方式(转载)
    Git reset与checkout的区别
    C# 串口导致电脑蓝屏一个可能的原因
    两个用于win7任务栏显示进度的dll
    批量远程执行shell命令工具
    基于zookeeper的主备切换方法
    代码的演变随记
    svn错误:Can't convert string from 'UTF-8' to native encoding
    not allowed to access to crontab because of pam configuration
    大数据利器
  • 原文地址:https://www.cnblogs.com/xxm980617/p/10888264.html
Copyright © 2011-2022 走看看