JavaScript中this的指向问题
2011-07-28 13:43
666 查看
在《JavaScript高级程序设计》一书中说道“this是函数在执行时所处的作用域”,这句话有些问题,与实际事实不符,看下面的例子:
[code]
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
这个例子中的this指向的是什么?显然是tom。那么f(即e)执行时所处的作用域是什么?显然是全局作用域。假如f执行时所处的作用域如作者所说为this所指对象的话,那就意味着在本例中f执行时所处的作用域为tom,也就是说在f执行过程中,与其作用域链相对应的那个变量对象链的最前端那个对象是tom,而这就意味着在此时函数体内对名称greeting进行解析时首先遇到的是tom中定义的greeting,于是两条输出语句的结果都应该是“HellofromTom!”,这不符合事实,所以按作者的说法所做的那个假设是错误的。
JavaScript中的this的指向:
函数作为哪个对象的方法调用,函数体内的this(不包括嵌套定义在其中的函数中的this)指向的就是那个对象。
结合new运算符调用一个构造函数时,系统会先自动生成一个对象,然后在该对象上调用构造函数。此时在构造函数体内,this指向的就是这个对象。
直接调用一个函数,相当于把它当作全局对象的方法调用。
JavaScript中没有类作用域的概念,因此方法内部要访问据以调用此方法的那个对象的属性,必须使用this关键字,按“this.属性名”的语法来访问。
vargreeting='Hellofromglobalscope!';
[code]
functione(){
alert(greeting);
alert(this.greeting);
}
vartom={
greeting:'HellofromTom!'
};
tom.f=e;
tom.f();//执行结果依次是'Hellofromglobalscope!','Hellofromtom'
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
这个例子中的this指向的是什么?显然是tom。那么f(即e)执行时所处的作用域是什么?显然是全局作用域。假如f执行时所处的作用域如作者所说为this所指对象的话,那就意味着在本例中f执行时所处的作用域为tom,也就是说在f执行过程中,与其作用域链相对应的那个变量对象链的最前端那个对象是tom,而这就意味着在此时函数体内对名称greeting进行解析时首先遇到的是tom中定义的greeting,于是两条输出语句的结果都应该是“HellofromTom!”,这不符合事实,所以按作者的说法所做的那个假设是错误的。
JavaScript中的this的指向:
函数作为哪个对象的方法调用,函数体内的this(不包括嵌套定义在其中的函数中的this)指向的就是那个对象。
结合new运算符调用一个构造函数时,系统会先自动生成一个对象,然后在该对象上调用构造函数。此时在构造函数体内,this指向的就是这个对象。
直接调用一个函数,相当于把它当作全局对象的方法调用。
JavaScript中没有类作用域的概念,因此方法内部要访问据以调用此方法的那个对象的属性,必须使用this关键字,按“this.属性名”的语法来访问。
相关文章推荐
- JavaScript难点——this的用法及指向问题
- 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题
- javascript中this 的指向问题(二)
- JavaScript中this的指向问题
- javascript中this对象的指向问题
- javascript中this指向问题
- javascript中this指向问题的综合
- 谈谈 JavaScript 中的 this 指向问题
- [置顶] 细说JavaScript中this指向问题
- JavaScript中this的指向问题
- JavaScript 中的this指向问题
- JavaScript中this的指向问题
- JavaScript call apply使用——JavaScript对象的方法绑定到DOM事件后this指向问题
- 函数中this的指向问题 ——Javascript 进阶知识整理
- 详解JavaScript中this的指向问题
- javascript的this指向问题深度解析
- JavaScript中this的指向问题
- JavaScript的this指向问题深度解析
- javascript中this的指向问题
- javascript中this的指向问题