this是什么

  • this是content,中文翻译成上下文,
  • 是指一个行为发生的主体
  • 也就是说,这个行为是谁发生的(谁执行的),就是谁
  • 比如说吃饭这个行为,谁在吃饭,那吃饭方法里的this就是谁;

分清:作用域和上下文

  • 你去饭店里吃饭,你占用了饭店的时间,那些碗筷桌椅都是这个空间里的变量,你吃完饭要把这个空间释放掉,这个饭店的空间就是作用域,而吃饭的人是你,你就是吃饭这个方法里的那个this,叫上下文;
  • 在哪儿干这件事,谁干的这件事;分别是作用域和上下文

辨清this的几种情况;

function fn=(){
alert(this)
}
fn();
document.documentElement.onclick=fn;
var obj={fn:fn}
obj.fn();
//this关键字是谁,和在哪儿定义的没有关系,只和在哪儿执行有关系;定义的时候,不知道this是谁,只有在执行的时候才知道this是谁;
//和变量不同;变量是定义的时候决定的;
//变量属于哪个作用域,由它在哪儿(作用域里)定义的有关系;

下面是函数销毁/释放的题。哪些定义域;哪些是互不影响的;

<script >
var i=9;
function fo(){
var i=0;
return function(n){
return n+i++;//n和i先相加,然后i再累加;
}
};

var f=fo();
//提示:f的定义是这样的 function f(n){return n+i++}
var a=f(15);alert(a);//15
var b=fo()(15);alert(b)//15 运行完以后是会释放的,因为返回的值乜有变量储存;
var c=fo()(20);alert(c)//20、运行完以后,值也会释放掉;
var d=f(20);alert(d);//21,因为有f在左边储存函数的方法,无法释放,上一次的a(15)弹出15的时候,i有++一次;再返回的时候,这个时候i从变成了1了。所以这个时候是21;
</script>

如果函数里的

function fo(){
var i=0;

改成

function fo(){
i=0;

这个时候,虽然第四行的d,弹出来还是21;但是本质是变了。

  • a运行的以后,i变成1;
  • b运行的时候,i先归零,然后运行完成后,i变成1;
  • c运行的时候,i先归零,然后运行完成后,i变成1;
  • d运行的时候,i是c运行留下来的1;所以这个时候是21;

再次改变,答案见注释:

<script >
var i=9;
function fo(){
i=0;//无var
return function(n){
return n+i++;//n和i先相加,然后i再累加;
}
};

var f=fo();
//提示:f的定义是这样的 function f(n){return n+i++}
var a=f(15);alert(a);//15
var b=fo()(15);alert(b);//15
var c=fo()(20);alert(c);//20
var e=f(15);alert(e);//16
var d=f(20);alert(d);//22
</script>

因为

  • var c=fo()(15);
  • var c=fo()(20)

都会开辟一个新的作用域;而且这两个作用域是没有半毛钱关系的;

而fo是开始就已经开辟的作用域

  • 每执行一次,执行结束后,i就是自增一个1;
  • 后面再执行fo方法的时候;还会指向fo的内存地址(fo的内存地址是不变的,而且fo的内存地址是无法释放掉的)
  • 如果想让fo消失,需要在后面加一行代码:f=null;

 

 

 

 

 

 

 

·····