`

Javascript中this的用法小结

阅读更多
1. 概述
this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascript中,由于javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定。这个特性在给我们带来迷惑的同时也带来了编程上的自由和灵活,结合apply(call)方法,可以使JS变得异常强大。

2.变化的this
在JavaScript中,this通常指向的是我们正在执行的函数本身,或者是指向该函数所属的对象(运行时)。当我们在页面中定义了函数doSomething()的时候,它的owner是页面,或者是JavaScript中的window对象(或 global对象)。对于一个onclick属性,它为它所属的HTML元素所拥有,this应该指向该HTML元素。

2.1在几种常见场景中this的变化

函数示例
function doSomething ()
{
alert(this.navigator); //appCodeName
this.value = "I am from the Object constructor";
this.style.backgroundColor = "# 000000";
}
1. (A)作为普通函数直接调用时,this指向window对象.

2. (B)作为控件事件触发时

1) inline event registration 内联事件注册 .将事件直接写在HTML代码中(<element

onclick=”doSomething()”>), 此时this指向 window对象 。

2) Traditional event registration 传统事件注册 (DHTML方式).
形如 element.onclick = doSomething; 此时this指向 element对象

3) <element onclick=”doSomething(this)”>作为参数传递可以指向element

3. (C)作为对象使用时this指向当前对象。形如:new doSomething();
4. (D)使用apply 或者call方法时,this指向所传递的对象。

形如:var obj={}; doSomething.apply(obj,new Array(”nothing”); //this?obj
2.2 this 指向分析

1 A场景。
直接调用的情况下,doSomething的运行时拥有者是window对象,因此this指向window
图示:


图1:A场景

2 B场景。
1)Traditional Event Registration
当我们要让函数中的this指向当前HTMLELEMENT时,可这样写
element.onclick = doSomething;
doSomething的引用(地址)赋给了element的onclick属性(这样就成为了函数)。此时
doSomething运行时拥有者(owner)就变成了element,this便指向了element。

图示:


图2: B场景 Traditional Event Registration

进行批量添加事件时,this均可正确指向。

图示:


图3: 多次Traditonal Event Registration

2) Inline Event Registration
形如 <element onclick=”doSomething()”>
图示:


图4:B场景 Inline Event Registration

这两种注册方式的区别是
element.onclick = doSomething;
alert(element.onclick)
可以得到
function doSomething() {
alert(this.navigator); //appCodeName
this.value = "I am from the Object constructor";
this.style.backgroundColor = "# 000000";
}
可以看到this关键字被展现在onclick函数中,它指向HTML元素。

如果执行
<element onclick="doSomething()">
al ert(element.onclick)

可以得到 :
function onclick(){
doSomething();
}

这仅仅是对doSomething()函数的一次调用,而doShomething的拥有者是window,因此 doSomething内的this指向window对象(啰嗦哦…….).

3 . C场景
具体内部细节不太了解,不知道是否可以这样理解
new doSomething(…..)
约等同于
var tempObj = {}; doSomething.apply(obj,new Array());
这样tempObj 可以得到doSomething内所定义的属性和方法,但是对 于 doSomething.prototype上的属性方法无法得到-_-!!

4 D场景
不懂…..

完了
不专业,比较浅显,想不出几个专有名词,郁闷~

PS 1:好多内容是copy的(*_*!),对图中表达有点疑意。图上多次写出 copy of function ,按照字面理解是函数对象的拷贝,我认为实际上是一个引用拷贝,对象拷贝是不可能的,如果是这样的话,每次添加事件都会拷贝一次对象,这显然不妥。

PS 2: 因为this指向在运行时才确定,我们经常碰到一个问题,当给一个DOM对象添加事件后,我们希望this指向一个指定对象,而非DOM对象本身,如下例。
<input type="button" id='btn' />
<script language="javascript">function btnObj(id)
{
this.disabled = true;
this.btn=document.getElementById(id);
/*
this.btn.onclick = btnOnclick ;
假如我们这样写,this会指向DOM对象,btnOnclick执行过程会报错
因为DOM btn并没有一个btn属性
*/
//通过这种方式可以解决这个问题[有些情况也可用tempThis = this这种形式]
this.btn.onclick = passHandler(this,btnOnclick);}function btnOnclick()
{

//如果this是DOM对象,这里就会报错,因为没有btn属性
this.btn.disabled = this.disabled;
}

function passHandler(obj,fun,arg)
{
return function(){
//if(!arg) {var arg = [];}
return fun.apply(obj,(arg?arg:[]));
}
}

new btnObj(”btn”);
</script>

其他灵活的应用还有很多,就不一一列举了(大家都比偶研究的要深入-_-!)。几位有需要补充可以回复或者直接在文章上改,OVER~~~
分享到:
评论

相关推荐

    Javascript的this用法

    ### JavaScript中的`this`用法详解 在JavaScript中,`this`关键字的使用十分常见,但也是最容易引起混淆的部分之一。正确理解`this`的工作原理对于编写高效、可靠的代码至关重要。本文将深入探讨`this`在不同上下...

    javascript中onclick(this)用法介绍

    总结来说,在javascript中,onclick(this)的用法主要是将当前被点击的元素作为上下文对象传递给事件处理函数。在事件处理函数内部,我们可以访问到这个对象的所有属性和方法,从而实现对事件的处理和响应。通过这种...

    javascript 中 this 的用法.docx

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

    javascript 中关于 this 的用法.zip

    在JavaScript编程语言中,...总结起来,JavaScript中的this用法是多样的,理解其行为并学会在不同场景下正确使用this是JavaScript开发者必备的技能。通过深入学习和实践,你将能够更有效地控制代码中的对象和函数行为。

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

    总结起来,理解JavaScript中的`this`关键字至关重要,因为它在不同情境下有不同的行为。在编写代码时,正确地理解和使用`this`可以帮助我们更好地控制代码的执行环境,避免安全问题,比如避免意外修改全局变量,确保...

    javascript中的self和this用法小结

    本文将围绕self与this在JavaScript中的用法进行详细解析。 首先,我们从一段代码片段引入了self和this这两个概念的讨论。在JavaScript中,self并不是一个保留字或内置关键字,而是开发者通常用于指代this的一个变量...

    javascript中this用法实例详解

    总结来说,JavaScript中的`this`用法相对灵活,需要开发者根据不同的调用场景来判断`this`的指向,并采取相应的策略来确保代码的正确执行。理解`this`的机制,不仅可以避免常见错误,还可以利用它来编写更加灵活的...

    javascript this用法小结

    JavaScript中的this关键字是一个非常...总结来说,JavaScript中的this关键字是一个非常灵活且重要的概念,它在不同的调用上下文中有不同的行为。理解并正确地使用this,可以帮助开发者编写更加高效且易于维护的代码。

    5分钟理解JavaScript中this用法分享

    总结来说,`this`在JavaScript中的行为取决于其调用环境。理解这些规则对于编写更健壮的JavaScript代码至关重要。在实践中,要特别注意`this`在函数调用、构造函数、方法调用以及事件处理中的不同表现。通过这些实例...

    Javascript中this的用法详解

    JavaScript中的`this`关键字是一个非常重要的概念,它用于在函数执行时引用当前上下文的对象。在不同的场景下,`this`的指向会有所不同,本文将详细介绍四种常见的`this`用法。 1. 全局作用域与函数中的`this` 在...

    JavaScript中this关键字用法实例分析

    在JavaScript中,`this`关键字是一个非常重要的概念,它用于引用当前执行上下文的对象。`this`的值在运行时动态确定,根据函数被调用的方式而变化。下面我们将通过一系列实例来深入理解`this`的关键字用法。 首先,...

    原生javascript中this几种常见用法总结

    下面我们将详细探讨原生JavaScript中`this`的几种常见用法。 1. **默认绑定**: 当函数作为独立的实体(全局作用域或没有明确上下文)调用时,`this`被绑定到全局对象。在浏览器环境中,全局对象通常是`window`。...

    Javascript原型对象、this的5钟用法、原型继承、Caller和Callee的使用.docx

    总结来说,理解JavaScript中的原型对象、this用法、原型继承和Caller/Callee对于编写高效、可维护的代码至关重要。这些概念构成了JavaScript面向对象编程的基础,帮助开发者实现对象间的关联和复用,以及创建复杂的...

    java中this&super的用法小结.doc

    总结起来,`this`和`super`是Java中非常重要的两个关键字,它们帮助我们处理对象的内部引用和继承关系中的问题。正确地使用它们能确保代码的清晰性和有效性,同时提高代码的可维护性。在编写Java代码时,了解和熟练...

    javascript中eval和with用法实例总结.docx

    ### JavaScript中的`eval`与`with`用法详解 #### 一、`eval`函数 ##### 1. 定义 `eval`是JavaScript中一个非常强大的内置函数,它可以将字符串解析并执行为JavaScript代码。这使得开发者能够在运行时动态地创建和...

Global site tag (gtag.js) - Google Analytics