Javascript 的 this 关键字总是指向当前被执行函数的所有者。

换句话说,如果当前函数可以视为某个对象的一个方法,那么 this 就指向该对象。

例如有这么一个函数 doSomething()

function doSomething(){
this.style.color = '#cc0000';
}

如果 doSomething() 定义全局上下文中,那么 this 指向的就是全局变量 window。但是 window 没有 style 属性,所以在全局环境中执行该函数将提示错误。因此使用 this 关键字需要特别注意函数的所有者。

复制

在 JS 的事件处理中,我们要实现 this 关键字正确指向某个页面元素,则必须将函数复制该元素的某个属性上,例如 onclick 属性。

element.onclick = doSomething;

以上代码演示了函数被完整地复制到了 onclick 属性,因此当执行 doSomething 函数时,对应的 element 元素的颜色将发生改变。

引用

当你使用内联事件注册时。

<element onclick="doSomething()">

你没有复制函数,你只是引用了该函数,它们之间的区别十分重要,因为 onclick 属性没有包含任何真正的函数代码,而仅仅是一次函数调用。

它的意思是跳转到 doSomething() 函数并执行它,因此当代码执行到 doSomething() 时,this 其实是指向 window 这个全局对象。

区别

如果你想在事件处理中正确使用 this 访问 HTML 元素,你必须保证 this 关键字真正写入到了 onclick 属性。如果 this 关键字正确写入到了 onclick 属性,那么你输入:

element.onclick = doSomething;
alert(element.onclick)

你会得到

function doSomething() {
this.style.color = '#cc0000';
}

正如你所见,this 关键字在 onclick 方法中,因此它会指向 HTML 元素。

如果你输入的是

<element onclick="doSomething()">
alert(element.onclick)

你会得到

function onclick(){
doSomething()
}

这仅仅是引用到函数 doSomething()this 关键字并没有出现在 onclick 方法中,因此它不会引用到 HTML 元素。

示例 - 复制

以下情况中,this 都被写入到 onclick 方法中:

element.onclick = doSomething
element.addEventListenser('click', doSomething, false)
element.onclick = function() {this.style.color = '#cc0000'; }
<element onclick="this.style.color = '#cc0000';">

示例 - 引用

以下情况 this 引用到 window

element.onclick = function () {doSomething() }
element.attachEvent("onclick", doSomething)
<element onclick="doSomething()">

混合

如果想在内联事件注册中使用 this,可以按以下方法实现:

<element onclick="doSomething(this)">

function doSomething(obj) {
obj.style.color = '#cc0000';
}

Ref:

Javascript this 关键字的更多相关文章

  1. javascript this关键字指向详解

    在之前写代码的经历中,常常试过写着写着this就莫名其妙的不知道指向到哪里去了.今天看了曾探的javascript设计模式,里面特别谈到了this在不同情况下指代的对象,非常有意思. this指代的情 ...

  2. JavaScript 保留关键字

    JavaScript 保留关键字 在 JavaScript 中,一些标识符是保留关键字,不能用作变量名或函数名. JavaScript 标准 所有的现代浏览器完全支持 ECMAScript 3(ES3 ...

  3. JavaScript保留关键字(全)

    JavaScript 标准 所有的现代浏览器已经完全支持 ES5(ECMAScript 5). JavaScript 保留关键字(keyword) Javascript 的保留关键字(标识符)不可以用 ...

  4. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  5. JavaScript——this关键字

    请看下面的代码,最后alert出来的是什么呢? 1 var name = "Bob"; 2 var nameObj ={ 3 name : "Tom", 4 s ...

  6. javascript保留关键字

    1.通用保留关键字 break delete function return typeof case do if switch var catch else in this void continue ...

  7. JavaScript搜索关键字高亮的实现

    高亮功能主要是指对页面中指定区域的指定文字进行高亮显示,也就是背景着色.一般在搜索结果页面会经常用到这个功能. 下面就为大家提供一种解决方案,用javascript实现. 首先在<head> ...

  8. 跟着9张思维导图学习Javascript js 关键字和保留字 css3中的BFC,IFC,GFC和FFC

    跟着9张思维导图学习Javascript   学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小ti ...

  9. javaScript的关键字与保留字

    JavaScript 关键字: break case catch continue default delete do else finally for function if in instance ...

随机推荐

  1. iOS开发----地图与导航--定位和位置信息获取

    要实现地图.导航功能,往往需要先熟悉定位功能,在iOS中通过Core Location框架进行定位操作.Core Location自身可以单独使用,和地图开发框架MapKit完全是独立的,但是往往地图 ...

  2. bzoj 3399: [Usaco2009 Mar]Sand Castle城堡

    3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec  Memory Limit: 128 MB Description 约翰用沙子建了一座城堡.正 ...

  3. 分享45个设计师应该见到的新鲜的Web移动设备用户界面PSD套件

    对于一个网页设计师来说做一个好的PSD模板是非常有挑战性的一项任务,虽然PSD的模板简化了设计任务,但找出高质量的PSD文件,可以自由使用,是一 项艰巨的任务.你必须通过许多网页去找出一个极少数的PS ...

  4. Python学习笔记(2):数据库访问

    本来打算继续用Access的,但费了非常大的劲,还是没有搞定.回过头,发现使用sqlite,简单到令人发指.干脆,把C#的CommonCode往这边迁移,先把AccessDB搬过来再说. 类结构和C# ...

  5. [转]office2010一直卡在“正在受保护的视图中打开”

    用Office 2010 打开文件遇到“”,如下图: 转自: 解决办法: 还可以使用下面的方法打开上图的受保护视图设置界面:   1. 启动 Word 2010 应用程序,单击[文件]按钮并选择[选项 ...

  6. BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的解决办法

    BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact represent ...

  7. NGUI 减少drawcall规则

    前置说明一: Unity中的drawcall定义: 每次引擎准备数据并通知GPU的过程称为一次Draw Call. Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎 ...

  8. Windows 10开启默认网络驱动器访问

    在Windows 10的系统策略中,驱动器盘符的网络访问是默认关闭的,用管理员权限打开注册表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curre ...

  9. javascript 中的getter,setter

    1.什么是getter,什么是setter? getter 是一种获得属性值的方法,setter是一种设置属性值的方法. 2.怎么定义? 有2种办法: 在对象初始化的时候定义 在对象定义后的时候定义 ...

  10. asp Gridview绑定形式获取行号

    Gridview中使用<%# Container.DataItemIndex %>取得当前行的序号 而在Repeater控件中使用Container.ItemIndex取得当前行的序号 & ...