Js中的this关键字(吉木自学)

研究生毕业答辩完,开始继续为转行努力。小白要奋斗了,加油。本文引自 JS核心系列:浅谈函数的做用域

在一个函数中,this老是指向当前函数的全部者对象,this老是在运行时才能肯定其具体的指向, 也才能知道它的调用对象。html

1 window.name = "window";
2 function f(){
3     console.log(this.name);
4 }
5 f();//输出window
6 
7 var obj = {name:'obj'};
8 f.call(obj); //输出obj

在执行f()时,此时f()的调用者是window对象,所以输出"window"。闭包

f.call(obj) 是把f()放在obj对象上执行,至关于obj.f(),此时f中的this就是obj,因此输出的是"obj"。函数

 code1:post

 1 var foo = "window";
 2 var obj = {
 3     foo : "obj",
 4     getFoo : function(){
 5         return function(){
 6             return this.foo;
 7         };
 8     }
 9 };
10 var f = obj.getFoo();
11 console.log(1+":"+f()); //输出window

 code2:this

 1 var foo = "window";
 2 var obj = {
 3     foo : "obj",
 4     getFoo : function(){
 5         var that = this;
 6         return function(){
 7             return that.foo;
 8         };
 9     }
10 };
11 var f = obj.getFoo();
12 console.log(f()); //输出obj

code1:
执行var f = obj.getFoo()返回的是一个匿名函数,至关于:
var f = function(){
return this.foo;
}
f() 至关于window.f(), 所以f中的this指向的是window对象,this.foo至关于window.foo, 因此f()返回"window" url

code2:
执行var f = obj.getFoo() 一样返回匿名函数,即:
var f = function(){
return that.foo;
}
惟一不一样的是f中的this变成了that, 要知道that是哪一个对象以前,先肯定f的做用域链:f->getFoo->window 并在该链条上查找that,此时能够发现that指代的是getFoo中的this, getFoo中的this指向其运行时的调用者,从var f = obj.getFoo() 可知此时this指向的是obj对象,所以that.foo 就至关于obj.foo,因此f()返回"obj"。spa

对做用域链不清楚的同窗能够参看JavaScript从做用域到闭包code

相关文章
相关标签/搜索