原文: http://blog.csdn.net/jlu16/article/details/77727639 ------------------------------------------- 在javascript中经常出现函数中嵌套函数的情况。尤其是在对象函数中嵌套的函数,往往需要调用外部函数(对象函数)的this。但是如果直接在内部里调用this,得到的是当前函数(内部函数)的this。
var obj = { name: 'jane', friends: ['tarzan','cheeta'], loop: function() { this.friends.forEach( function (friend) { console.log(this.name + 'knows '+friend); } ); //forEach } //loop }; //obj
如果直接 obj.loop();是无法成功的,因为console.log(this.name……一句中的this并非指向obj,而是指向function (friend)…的执行环境,即函数loop。而函数loop中并没有定义this.name。
一定注意:this默认指向执行当前函数的外部环境对象!
---------------------------------------------------- 解决方法:
一.
由于在内部函数 function(friend) 中将this同名覆盖了,如果预先将外部的this保存在一个不会被覆盖的量中,便可在内部函数中直接使用。
即在loop: function()中加入 var that = this ,在loop: function() 的内部函数中将this调用改为that调用。 ------------------------- 二.
使用bind函数的thisValue参数将内部函数的this绑定为外部的this。
将function (friend) {…} 改为 function (friend) {…}.bind(this) 。 ------------------------- 三.
这个方法针对forEach()的调用。forEach可以在调用时提供第二个参数,这个参数成为forEach调用的函数的this变量。
this.friends.forEach(function(){…},this);
|