JavaScript 中的 this 为一个重难点,它不像静态语言 C#、Java 一样,就表示当前对象。而在 JS 中, this 是运行时确定,而并非定义时就已确定其值。
谈起 this ,必须少不了 JavaScript 另一个重点:函数,在 JS 中函数有以下几种定义方法。
1 // 函数声明 2 function fun(){ 3 4 } 5 6 // 函数表达式 7 var fun=function(){ 8 9 }; 10 11 // Function 构造函数 12 var fun=new Function (arg1, arg2, ... argN, functionBody) arg1 arg2 .... 为函数形参 functionBody 为函数主体
一 this 指向 window
1 function f(){ 2 3 console.dir(this); 4 console.dir(this.f===f); 5 console.dir(this===window) 6 7 } 8 9 f(); 10 11 // 此时,可视 f 为 window 对象下定义的一个属性,f() 可视为由 window 进行调用,此时,this 即指向 window
二 this 指向当前对象
1 var obj={name:"jack",age:20,say:function() 2 { 3 console.dir(this); 4 console.dir(this===obj); 5 alert(this.name); 6 7 }}; 8 9 obj.say(); 10 11 // 通过 obj 对象调用 say 方法,而此时 say 方法即指向当前对象
三 this 指向通过构造器函数所创建的对象
1 var Person=function(name,age) 2 { 3 this.Name=name; 4 this.Age=age; 5 console.dir(this); 6 7 }; 8 9 new Person("jack",20); 10 11 Person("jack",20); 12 13 // 前者通过 new 关键词,调用 Person 函数,此时,this 指向当前构造器函数所创建的对象 14 15 16 // 而后者,直接调用 Person 函数,参考第一条,可视为 window.Person(),此时,this 指向 window
四 this 在原型中,指向通过该构造器函数创建的对象(同 new )
1 var Person=function(name,age) 2 { 3 this.Name=name; 4 this.Age=age; 5 6 }; 7 8 Person.prototype.say=function() 9 { 10 console.dir(this); 11 12 13 } 14 15 new Person(“jack”,20).say(); 16 17 // 首选,以 Person 为构造器创建对象,再调用 say 方法,此时,this 指向以该构造器造建的函数对象
最后,看看几个容易引起误解的地方 ,有关该函数中 this 指向,关于以下两个,本人仅仅通过 chrome 控制台及调试,原理性感觉用 Java、C# 的无法解释。
1 var f={name:'jack',age:20,say:function() 2 { 3 console.dir(this); 4 console.dir(this.name); 5 6 }}; 7 8 var f1=f.say; 9 10 f1(); 11 12 console.dir(window.name); 13 14 15 // 将 f 对象中 say 属性(say 为函数)赋值给 f1 变量,而此时,通过 f1()调用,此时,this 指向 window,并非 f 对象
1 var f=function() 2 { 3 console.dir(this); 4 5 var f1=function() 6 { 7 8 console.dir(this); 9 console.dir(this===f); 10 11 }; 12 13 f1(); 14 15 }; 16 17 f(); 18 19 // 在函数中,再定义一个函数时,同时,在外层函数中调用该函数,而此时 ,this 并非指向外层函数对象,而是指向 window
参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions