关于javascript的this关键字,首先我看了ECMA-262 第三版的介绍:
Activation Object
当进入到一个function code的执行上下文,一个叫作activation object(活动对象)的对象被创建,并关联到该执行上下文. 活动对象中一个名叫arguments特征为{ DontDelete }的属性一起初始化.this属性的初始值是arguments对象在下面会讲述.
this
有一个this值和每一个活动的执行上下文关联.this的值取决于调用者(caller)和执行代码的类型(type),并且在进入执行上下文的时候它就已经定下来了,this和执行上下文关联的值是不可变的.
并且对进入一个执行上下文,它也有很详细的介绍:
Entering An Execution Context
每个function和constructor 调用进入到一个新的执行上下文,即使一个function调用它自身进行递归.每一个return存在一个执行上下文.一个抛出异常,如果不捕捉,可能存在一个或更多的执行上下文.
当控制进入到一个执行上下文,作用域链(scope chain)被创建且被初始化,变量实例被执行,并且this的值被定了下来.
作用域链,变量实例和this值的确定由进入的执行代码类型决定.
在《javascript高级程序设计》中也专门讲到了this关键字:
其用在对象方法中.this关键字总是指向一个object,而该object调用一个特定的方法.通过使用this,能够在不同的场合重用同样的function.
个人总结:
在调用this关键字,js会在执行上下文中寻找执行代码的活动对象,然后获取this关键字的指向,this取值由调用者决定,但如果是在html页面标签中的事件,则this值会不同.如:
<input type=”text” id=”name” >
<script>
document.getElementById(“name”).onclick = showValue();
function showValue(){
alert(this.value);
}
</script>
点击得到的值为””,而<input type=”text” onclick=”showValue()” >得到的值为”undefined”.
html标签中的事件在http://www.w3.org/TR/html4/interact/scripts.html 有讲到,其被称为Intrinsic events(固有事件).但是它并没有讲为什么在固有事件中声明this能得到当前html标签的一个属性值,而通过调用一个js文件的function则获取不到标签中的this的属性值。
在PPK的blog中则讲到了这个问题,并且他认为前者是copying方式,而后者是referring的方式,前者将方法直接拷贝到click事件,而后者是自己去找showValue()方法,找到后再执行.所以this关键字所有者还是window.原文链接:http://www.quirksmode.org/js/this.html
还有一个问题是:html事件属性是不是本身带有执行上下文,作用域链和活动对象?所以this关键字可以在固有事件中获取值?
这个问题其实是内联事件处理函数的特性问题,与其他函数不同,内联事件处理函数的作用域链从头部开始依次是:调用对象、该元素的 DOM 对象、该元素所属 FORM 的 DOM 对象(如果有)、document 对象、window 对象(全局对象)。
关于内联事件处理函数,以及不同浏览器兼容问题,http://www.w3help.org/zh-cn/causes/SJ9009 有详细的介绍.我就不copy了。
html5的规范中对events也有很详细的定义:http://www.w3.org/TR/html5/webappapis.html#events
java中的this关键字则简单得多,this只能在单个类的方法中使用,表示对当前对象的引用,this的作用范围是当前对象,它在内存中以栈的形式存在.随对象的调用产生,调用结束就回收.