`
buliedian
  • 浏览: 1238759 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

javascript中的this

 
阅读更多

[转至]http://hi.baidu.com/maxwin2008/blog/item/4d867f824f9cffb36d81194e.html

最近在学习javascript看到很多金典的文章,这里转载一篇吧,呵呵!

javascript里避免不了用到this,不过this的作用域scope问题常常会不经意间发送变化,导致程序出现错误或异常。
这里只对this做一些简单的总结,更详细的行为还需要大家去琢磨。
this都是用在函数function里的(废话...)。这里要说明一点,js里的函数就是一个普通函数(没有成员函数这一说法,准确的说),无论它定义在哪里。
所以一个函数可以绑定到任何对象上去用,这时成这个被绑定的对象为该函数的owner。ok,函数里的this就是指向他的owner的。
this的多变就是由于他的owner常常发生变化。举个例子:
< script type = "text/javascript" >
var o = {
_name
: 'o' , // used for debug
foo
: function (){
console
. log ( this . _name );
}
}

o
. foo ();
</ script >


这里o.foo就是一个函数(应该叫函数指针,指向一个函数function(){console.log(this._name);})。那么执行 o.foo()的时候,foo(确切说是foo指向的函数)的owner就是o,里面的this也是o,运行结果会打印'o';
为什么说是函数指针?再继续这个例子:
< script type = "text/javascript" >
var fn = o . foo ;
fn
();
</ script >
这里fn = o.foo并不是系统把o.foo这个函数copy给了fn,而是copy了o.foo的指针值,让fn也指向函数funtion(){console.log(this._name);}。
这时候执行fn什么效果呢?fn(again,确切说是fn指向的函数)“没了”owner,这时系统就会把window这个全局对象传给this,也就是说fn(不again了)的owner是window。
因为window里并没定义_name属性,这时会输出undefined。再测试一下,给window添加个熟悉_name;
< script type = "text/javascript" >
window
. _name = 'window' ;
fn
();
</ script >
OK,上面说了函数里的this到底指向的那个对象:执行时的owner。下面看看this为何会在实际应用中变化莫测。
根本原因很简单,他的owner变了,像上面的o.foo和fn两个例子就可以说明。以下举几个例子来说它经常的变化方式:
1. 对象里的函数(你知道这么说是不对的)调用了其他对象的函数,这时this就会变化
< script type = "text/javascript" >
// 例如常用的ajax
var o2 = {
xhr
: null ,
execute
: function (){
xhr
. onreadystatuschange = function (){
this . _traceXhr ( xhr ); // error here! 'this' is xhr now
}
},
_traceXhr
: function ( _xhr ){
console
. log ( _xhr );
}
}
</ script >
这里的错误比较明显了吧,function() {this._traceXhr(xhr);}是个函数,这时候是绑定到xhr上运行的,那里面的this自然就指向xhr而不再是o2。
正确的写法是o2._traceXhr(this); (ps,实际的应用中可能是这样的,一般会定义一个“类”,噢o2只是这个类的实例,那么定义类的时候需要这样写:
< script type = "text/javascript" >
function ClazzO (){
}

ClazzO . prototype . xhr = null ;
ClazzO . prototype . execute = function (){
var _self = this ;
xhr
. onreadystatuschange = function (){
_self
. _traceXhr ( this );
}
}
ClazzO . prototype . _traceXhr = function ( _xhr ){
console
. log ( _xhr );
}
</ script >
execute里用一个临时变量保存一下善变的this,防止到了onxxxchange里面的时候找不到他了。
主要是这一类问题导致this的变化,另外还有一些是和dom对象联系在一起的

2. dom对象event里的this
a: <input type = "button" id = "a" onclick = " javascript : console . log ( this . value ) " value = "click me a" />
这种写法输出结果和我们想的一样:click this。但有些同学就提意见了,在html里面夹杂太多的js代码不好,而且有时由于函数太复杂含有' or "导致根本不能写在这里面,最好抽出来放到一个函数里:
b: <input type = "button" id = "b" onclick = " javascript : clicked () " value = "click me b" />
<script type = "text/javascript" >
function clicked () {
console
. log ( this . value );
}
</script>

来看浏览器帮我们做了什么: onclick="[js code]"
浏览器会帮我们生成(这点我不确定,但按这种方式理解可以行得通)
[dom].onclick = function() {[js code]}
好,看看上面两个都发生了什么:
<script type = "text/javascript" >
// a
document
. getElementById ( "a" ). onclick = function () {
console
. log ( this . value );
}
// b
document
. getElementById ( "b" ). onclick = function () {
clicked
();
}
</script>
解释清楚了吧。还是owner变 了

3. 浏览器行为
这一点我只是顺便看到说ie和ff在绑定事件上的区别(attachEvent、addEventListener)继续看例子:
c: <input type = "button" id = "c" value = "click me c" />
<script type = "text/javascript" >
var c = document . getElementById ( "c" );
if ( document . attachEvent ) { // for ie
c
. attachEvent ( 'onclick' , clicked );
} else {
c
. addEventListener ( 'click' , clicked , false );
}
</script>
ie下输出undefined, ff下输出click me c, why? 加点debug信息再看看
d: <input type = "button" id = "d" value = "click me d" />
<script type = "text/javascript" >
function clicked2 () {
console
. log ( this , arguments );
for ( var i = 0 ; i != arguments . length ; ++ i ) {
console
. log ( 'arg' , i , ':' , arguments [ i ]);
}
}
var d = document . getElementById ( "d" );
if ( document . attachEvent ) { // for ie
d
. attachEvent ( 'onclick' , clicked2 );
} else {
d
. addEventListener ( 'click' , clicked2 , false );
}
</script>
看到了吧,ie下this成了window,ff则是出发时间的dom。不过两个都会给clicked2传个参数event

分享到:
评论

相关推荐

    JavaScript中this关键字使用方法详解

    在JavaScript编程语言中,`this`关键字是一个至关重要的概念,它常常引发初学者的困惑,因为它的值在不同的上下文中可能会有所不同。`this`关键字主要用来引用对象的上下文,或者说是当前执行环境中的对象。在本文中...

    javascript中this的指向问题总结

    JavaScript中this的指向还没搞明白?来这看看 你就懂啦~

    JavaScript中this指向.docx

    ### JavaScript中this指向详解 #### 一、引言 在JavaScript编程中,`this`关键字的使用及其指向问题一直是困扰很多开发者的难点之一。不同于传统面向对象编程语言如Java或C#中的`this`概念,JavaScript中的`this`...

    探寻JavaScript中this指针指向_.docx

    探寻JavaScript中this指针指向 JavaScript中的this指针指向是一个复杂的问题,需要深入了解JavaScript的函数调用机制和对象模型。这篇文章将深入探讨this指针指向的问题,并提供多个例子来说明this指针指向的规律。...

    复习JavaScript中this指向及绑定

    复习JavaScript中this指向及绑定

    JavaScript程序设计javascript中this

    JavaScript中的`this`关键字是程序设计中的一个核心概念,它在不同上下文环境中有着不同的指向,这使得理解和掌握`this`的用法至关重要。在JavaScript中,`this`的值取决于函数调用的方式,而不是定义的方式,这为...

    javascript 中 this 的用法.docx

    ### JavaScript 中 `this` 的用法详解 #### 一、引言 在 JavaScript 开发过程中,`this` 关键字的使用常常令开发者感到困惑。这是因为 `this` 的值并不是静态确定的,而是取决于函数调用的方式。了解 `this` 的...

    JavaScript中this的使用

    在JavaScript中,`this`关键字是用来引用函数执行上下文中的对象。它的行为有时可能会让初学者感到困惑,但理解其工作原理对于编写高效和可维护的代码至关重要。下面我们将深入探讨`this`的使用和一些常见场景。 1....

    JavaScript中this指向.pdf

    这种特性使得this在JavaScript中具有了多重含义,对于初学者来说,确实是一个令人困惑的概念。 首先,需要明确的是,在JavaScript中,this关键字的指向不是在编译期确定的,而是在运行期确定的。这与大多数主流的...

    JavaScript程序设计-javascript中this的指向问题.pdf

    在JavaScript编程中,`this`关键字是一个至关重要的概念,它表示当前上下文中的对象引用。在不同的场景下,`this`的指向会有所不同,这往往让开发者感到困惑。以下是关于`this`指向问题的详细解释: 一、普通函数...

    Javascript中神奇的this

    JavaScript中的this关键字是一个非常重要的概念,它在函数执行时确定了函数的执行上下文。在其他编程语言中,函数的调用上下文可能是明确的,但在JavaScript中,this的指向却可能因为多种不同的规则而变化,从而导致...

    深化理解Javascript中this的作用域_.docx

    在JavaScript中,`this`关键字的作用域是一个经常让人困惑的主题,尤其对于那些习惯于其他面向对象语言(如Java或C++)的开发者来说。在这些语言中,`this`通常固定地指向当前对象实例。然而,在JavaScript中,`this...

    详解JavaScript中this关键字的用法_.docx

    在JavaScript中,`this`关键字是一个非常重要的概念,它指的是当前执行上下文中的对象。`this`的值取决于函数的调用方式,而不是定义方式。下面我们将详细探讨在不同场景下`this`的用法。 1. **全局作用域中调用...

    深入理解Javascript中this的作用域

    对大多数有OOP开发经验的开发人员来说this是当前作用域中引用普通元素的标识符,但是在Javascript中它却显得古灵精怪的,因为它不是固定不变的,而是随着它的执行环境的改变而改变。在Javascript中this总是指向调用...

    js原生态函数中使用jQuery中的 $(this)无效的解决方法.docx

    在JavaScript开发中,使用jQuery的$(this)在原生态函数中可能会出现无效的问题,本文将对此进行详细的分析和解决方法的介绍。 一、问题描述 在JavaScript开发中,我们经常使用jQuery来简化我们的代码,但是当我们...

    javascript中this的用法实践分析

    本文实例讲述了javascript中this的用法。分享给大家供大家参考,具体如下: 实践一:this在点击等事件中的指向 html结构: &lt;button id='btn'&gt;click me&lt;/button&gt; javascript结构: var btn = document...

    关于javascript中this关键字(翻译+自我理解)

    首先,让我们了解JavaScript中的this关键字。在JavaScript中,this的指向不像其他一些面向对象的编程语言中那样固定,而是依赖于函数的调用方式。在传统的面向对象语言中,this关键字通常指代当前对象,但在...

    Javascript中this的用法详解

    应该是最常用的吧,函数中调用一个this,这里其实就是全局变量 var value="0"; function mei(){ var value="1"; console.log(this.value); //0 console.log(value); //1 } mei(); 输出0就是因为this指向的是全局...

Global site tag (gtag.js) - Google Analytics