js当中this的指向

2019-10-18  本文已影响0人  我是何宝荣呀

普通函数的this是谁? window
对象.方法中的this是谁?当前的实例对象
定时器方法的this是谁?window
构造函数的this是谁?实例对象
原型对象的this是谁?实例对象
严格模式下的this,一定要指明是谁调用了他,谁调用了他,this就是谁,如何没有对象调用,则为undefined

注:所有自执行函数中,所有没有指定指向的this,都将指向window。
类似于下面
!function(){..........}();

~function(){..........}();

+function(){..........}();

-function(){..........}();

(function(){..........})();

都指向window

例题
var a = {
        name:"zhang",
        sayName:function(){
          console.log("this.name="+this.name);
        }
    };

    var name = "ling";

    function sayName(){
        var sss = a.sayName;
        /*
        function(){
          console.log("this.name="+this.name);
        }
         */
        
        sss();            //this.name = ling
        a.sayName();      //this.name = zhang
        (a.sayName)();    //this.name = zhang
        (b = a.sayName)();//this.name = ling
    }

    sayName();
var sex = "male";
    var saySex = {
        sex:"female",
        saySex:function(){
          function getSex(){
              console.log("this.sex="+this.sex);
          }
          getSex();
        }
    }

    saySex.saySex();         //this.sex = male
    var ccc = saySex.saySex; 
    ccc();//this.sex = male

var sex = "male";
    var saySex = {
        sex:"female",
        saySex:function(){
            function getSex(){
                console.log("this.sex="+this.sex);
            }
            
            getSex.call(this);
        //与例2只有这个地方的变化
        }
    }

    saySex.saySex();         //this.sex = female  call将tis改变成了saySex这个实例对象
    var ccc = saySex.saySex; 
    ccc();//this.sex = male
var name = "ling";
    function sayName(){
        var a = {
          name:"zhang",
          sayName:getName
        };
        
        function getName(){
          console.log(this.name);
        }
        
        getName();      //this.name = ling
        a.sayName();    //this.name = zhang
        getName.call(a);//this.name = zhang
    }
    sayName();
var name = "ling";
    var obj = {
        name:"zhang",
        sayName:function(){
          console.log("this.name="+this.name);
        },
        callback:function(){
          var that = this;
          return function(){
              var sayName = that.sayName;
              that.sayName();  //this.name = zhang
              sayName();//this.name = ling
          }
        }
    }

    function addEvent(obj,type,callback){
        if(obj.addEventListener){
        obj.addEventListener(type,callback,false);
        }else if(obj.attachEvent){
        obj.attachEvent("on"+type,callback);
        }else{
        var fn = obj["on"+type];
        obj["on"+type] = function(){
            fn && fn();
            callback();
        }
        }
    }

    addEvent(document,"click",obj.callback());
 var name = "window.name";
    var obj = {
        name : "obj.name",
        getName:function(){
            console.log(this.name);
            return function(){
                console.log(this.name);
            } 
        }
    }
    obj.getName()();  // obj.name   window.name

this的指向,只与调用它的对象有关,如果没有调用它的对象的话,那么就是window,这里是去除没有call、apply、bind改变指向的情况下,且注意,bind不会将函数运行一遍,而call和apply都会将函数运行一遍

题目参考是:
http://www.zhangyunling.com/251.html
也有一些是我在网上看到摘抄的!不懂的话就问我呀

上一篇 下一篇

猜你喜欢

热点阅读