this 的使用方法

138 阅读2分钟

this 是什么?

this是指包含它的函数在被方法调用时所指的对象。就是谁调用了我,我就是谁的对象,谁最后调用了我,我就是谁的对象。记住一下三点。

  • 包含它的函数

  • 作为方法被调用时

  • 所属的对象

this 的使用方法

function showName(){
     console.log(this); //window
 }
showName();

因为test()函数是在全局中被window对象所调用的,那么this久理所当然的是指向window对象了,可是 name变量是定义在testFun函数里面的,window对象中并没有定义name变量,当然也就不会打印出"hello this"这个字符串了。

var name = "hey";
function testFun() {
    var name = "hello this!";
    console.log(this.name);
}
testFun();

此时定义了一个全局变量name,即在window对象上定义了name,这里的this指向函数function的对象,即window,所以this.name为window.name因此会打印出"hey"字符串来。

var obj={
    a:"哈哈哈",
    b:function(){
        var a="嘿嘿嘿";
        console.log(this.a);
    }
};
obj.b();

this被包含在函数b()中,但是因为是被对象obj所调用的,因此this属于对象obj,所以会打印出字符串"哈哈哈";

var obj = {
    a:10,
    b:{
        fn:function(){
            console.log(this.a); //undefined
        }
    }
};
obj.b.fn();

在这个例子中对象obj是在window上面定义的,所以obj.b.fn()=window.obj.b.fn(),那么大家会说this不是被window对象,或者被b调用了吗,请注意此时this最后是被fn锁调用的,所以this属于函数fn,因为在函数fn中并没有定义变量a,所以会打印出undefined;

总结

1. this指向的,永远只可能是对象!

2. this指向谁,永远不取决于this写在哪!而是取决于函数在哪调用。

3. this指向的对象,我们称之为函数的上下文context,也叫函数的调用者。

4. this的调用方法

  • 通过函数名()直接调用:this指向window
function func(){
            console.log(this);
        }
        

        //① 通过函数名()直接调用:this指向window
        func(); // this--->window
  • 通过对象.函数名()调用的:this指向这个对象
function func(){
            console.log(this);
        }

//② 通过对象.函数名()调用的:this指向这个对象
            // 狭义对象
            var obj = {
                name:"obj",
                func1 :func
            };
            obj.func1(); // this--->obj
            
            // 广义对象
            document.getElementById("div").onclick = function(){
                this.style.backgroundColor = "red";
            }; // this--->div
  • 函数作为数组的一个元素,通过数组下标调用的:this指向这个数组
function func(){
            console.log(this);
        }
        
//③ 函数作为数组的一个元素,通过数组下标调用的:this指向这个数组
        var arr = [func,1,2,3];
        arr[0]();  // this--->arr
  • 函数作为window内置函数的回调函数调用:this指向window( setInterval setTimeout 等)
function func(){
            console.log(this);
        }
        

//④ 函数作为window内置函数的回调函数调用:this指向window
        setTimeout(func,1000);// this--->window
        //setInterval(func,1000);