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对象。

 

posted on 2016-03-07 21:50  nekoooo  阅读(177)  评论(0编辑  收藏  举报

导航