javaScript this 之谜
作为接触js没多久的人对变量作用域和this所指表示非常迷惑,专门花了一个下午google了一下,感觉以前百度到的结果都是什么鬼。。。
下面是我对this的认识,学疏才浅请拍砖
每一个方法都有自己的上下文,方法中的this的指向看上下文环境,一般情况分为以下几种:
- 对象中的this
对象中的this指该对象,如果对象中定义了一个并不属于该对象的普通方法,那么该方法中的this指的就是全局的this,即window
1 var name = 'window'; 2 var obj = function(){ 3 this.name = 'object'; 4 var testThis = function () { 5 alert(this.name); 6 }; 7 testThis(); 8 }; 9 var myObj = new obj();
以上结果为window因为匿名函数中的this指的是全局对象。
1 var name = 'window'; 2 var obj = function(){ 3 this.name = 'object'; 4 this.testThis = function () { 5 alert(this.name); 6 }; 7 this.testThis(); 8 };
以上结果为object
对象中定义的属于该对象的方法,如this.somefunc = function(){}…如此定义的话该对象成为闭包,严重影响代码效率,且该闭包并没有发挥其作用反而浪费内存。
- 普通闭包(普通函数中的函数)中的this一般指的是window对象
1 var id = 'window'; 2 function showHelp() { 3 var that = this; 4 return function (){ 5 alert(that.id); 6 } 7 } 8 var showalert = showHelp(); 9 showalert();
以上结果为window
- 如果某个函数被赋予给某个对象的属性,那么该函数中的this指的是该对象,不管该函数默认的this指向哪里
1 var name = 'window'; 2 function testThis(){ 3 alert(this.name); 4 } 5 var obj = function(){ 6 this.name = 'object'; 7 this.testThis = testThis; 8 }; 9 var myObj = new obj(); 10 myObj.testThis();
以上输出结果是object.
- 事件监听回调函数中的this指的是触发事件的对象
1 function showHelp() { 2 return function (){ 3 document.getElementById('help').innerHTML = this.id; 4 } 5 } 6 function setupHelp() { 7 var elems = document.getElementsByTagName('input'); 8 for (var i = 0; i < elems.length; i++) { 9 elems[i].onclick = showHelp(); 10 } 11 }
以上回调函数是从showHelp函数中返回的匿名函数,匿名函数被赋给onclick属性,所以,匿名函数中的this指触发onclick的对象
1 function showHelp() { 2 var that = this; 3 return function (){ 4 document.getElementById('help').innerHTML = that.id; 5 } 6 } 7 function setupHelp() { 8 var elems = document.getElementsByTagName('input'); 9 for (var i = 0; i < elems.length; i++) { 10 elems[i].onclick = showHelp(); 11 } 12 }
以上回调函数也是从showHelp函数中返回的匿名函数,但是,由于showHelp是个普通闭包,且并没有赋值给onclick,赋值给onclick的是其子函数。那么,showHelp中的this指的是window,所以,返回的匿名函数中的that就是window对象。