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. 为什么说外卖O2O行业的未来在于尖端技术?

    7月13日,百度公司董事长兼CEO李彦宏在发布会上谈及百度外卖时表示,百度外卖里有非常多的人工智能技术的应用,比如同样的商家订单,先配送后配送,时间路线规划等等,都有人工智能的技术,涉及机器学习的问题 ...

  2. oracle sqlserver mysql数据库分页

    1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...

  3. AngularJS(一)

    什么是AngularJS[双向数据绑定:从界面的操作能实时反映到数据,数据的变更能实时展现到界面.]?1.AngularJS 使得开发现代的单一页面应用程序(SPAs:Single Page Appl ...

  4. js中的eval()和catch()

    定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 Java ...

  5. 【CUDA学习】全局存储器

    全局存储器,即普通的显存,整个网格中的任意线程都能读写全局存储器的任意位置. 存取延时为400-600 clock cycles  非常容易成为性能瓶颈. 访问显存时,读取和存储必须对齐,宽度为4By ...

  6. EWM ODO清理功能

    ERP OBD下传到EWM会自动产生拣货任务(通常做法),但如果EWM因库存不足或其它原因无法拣货时一般要差异确认,对ODO行项目进行0确认.但问题是零确认后EWM标准流程是无法回传ERP的. ERP ...

  7. Python 内置彩蛋

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  8. 推荐算法——距离算法

    本文内容 用户评分表 曼哈顿(Manhattan)距离 欧式(Euclidean)距离 余弦相似度(cos simliarity) 推荐算法以及数据挖掘算法,计算"距离"是必须的~ ...

  9. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  10. iOS-Xcode上传后iTunes Connect构建版本不显示

    在升级到Xcode8版本以后大多数人会碰到这个问题-开开心心开发好一款app以后上传到iTunes后台提交审核,然而iTunes Connect后台活动栏里没有出现我们上传的app,确切的说是显示一会 ...