JavaScript:闭包中的this

匿名函数的执行环境具有全局性,因此this经常指向window。

 1 var name = "window";
 2 var obj = {
 3   name : "obj",
 4   getName : function(){
 5     return function(){
 6       return this.name;
 7     }
 8   }
 9 };
10 console.log(obj.getName()());

 


以上代码执行结果:

window

闭包的活动对象中的this,有明确指向的只有window。为了解决这个问题,我们可以将外部作用域的this对象保存在一个变量里,就可以让闭包访问了。

 1 var name = "window"
 2 var obj = {
 3     name: 'obj',
 4     get: function() {
 5         var that = this
 6         return function() {
 7             return that.name
 8         }
 9     }
10 }
11 
12 console.log(obj.get()()) // obj

 

console.log(obj.getName()());

以上代码执行结果:

obj
1
因为that是我们在包含函数中特意声明的一个变量,因此闭包可以通过that访问到外部函数的this,即obj。

还有一种特殊情况会使this的值改变

 

 1 var name = 'window'
 2 var obj = {
 3     name: 'obj',
 4     get: function() {
 5         return this.name
 6     }
 7 }
 8 
 9 var getname1 = obj.get
10 console.log(obj.get()) // obj
11 console.log(getname1()) // window

 


以上代码执行结果:

obj
window
当把方法赋值给getname2时,由于getname2属于window,因此this的指向就不能得到维持。

posted on 2020-07-21 11:00  JKHao  阅读(285)  评论(0编辑  收藏  举报

导航