深入理解JavaScript中的this关键字

在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。

对于this变量最要的是能够理清this所引用的对象到底是哪一个,也许很多资料上都有自己的解释,但有些概念讲的偏繁杂。而我的理解是:首先分析this所在的函数是当做哪个对象的方法调用的,则该对象就是this所引用的对象。

示例一、

 

var obj = {};
obj.x
= 100;
obj.y
= function(){ alert( this.x ); };
obj.y();
//弹出 100

这段代码非常容易理解,当执行 obj.y() 时,函数是作为对象obj的方法调用的,因此函数体内的this指向的是obj对象,所以会弹出100。

示例二、

 

代码
var checkThis = function(){
alert(
this.x);
};
var x = 'this is a property of window';

var obj = {};
obj.x
= 100;
obj.y
= function(){ alert( this.x ); };

obj.y();
//弹出 100
checkThis(); //弹出 'this is a property of window'

 

这里为什么会弹出 'this is a property of window',可能有些让人迷惑。在JavaScript的变量作用域里有一条规则全局变量都是window对象的属性。当执行 checkThis() 时相当于 window.checkThis(),因此,此时checkThis函数体内的this关键字的指向变成了window对象,而又因为window对象又一个x属性( 'this is a property of window'),所以会弹出 'this is a property of window'。

上面的两个示例都是比较容易理解的,因为只要判断出当前函数是作为哪个对象的方法调用(被哪个对象调用)的,就可以很容易的判断出当前this变量的指向。

 

this.x 与 apply()、call()

通过call和apply可以重新定义函数的执行环境,即this的指向,这对于一些应用当中是十分常用的。

示例三:call()

代码
function changeStyle( type , value ){
this.style[ type ] = value;
}

var one = document.getElementById( 'one' );

changeStyle.call( one ,
'fontSize' , '100px' );

changeStyle(
'fontSize' , '300px'); //出现错误,因为此时changeStyle中this引用的是window对象,而window并无style属性。

注意changeStyle.call() 中有三个参数,第一个参数用于指定该函数将被哪个对象所调用。这里指定了one,也就意味着,changeStyle函数将被one调用,因此函数体内 this指向是one对象。而第二个和第三个参数对应的是changeStyle函数里的type和value两个形参。最总我们看到的效果是Dom元素 one的字体变成了20px。

示例四:apply()

代码
function changeStyle( type , value ){

this.style[ type ] = value;

}

var one = document.getElementById( 'one' );

changeStyle.apply( one , [
'fontSize' , '100px' ]);

changeStyle(
'fontSize' , '300px'); //出现错误,原因同示例三

apply的用法和call大致相同,只有一点区别,apply只接受两个参数,第一个参数和call相同,第二个参数必须是一个数组,数组中的元素对应的就是函数的形参。

 

无意义(诡异)的this用处

示例五:

代码
var obj = {
x :
100,
y :
function(){
setTimeout(
function(){ alert(this.x); } //这里的this指向的是window对象,并不是我们期待的obj,所以会弹出undefined
, 2000);
}
};

obj.y();

如何达到预期的效果

var obj = {
x :
100,
y :
function(){
var that = this;
setTimeout(
function(){ alert(that.x); }
,
2000);
}
};

obj.y();
//弹出100

事件监听函数中的this

var one = document.getElementById( 'one' );
one.onclick
= function(){
alert(
this.innerHTML ); //this指向的是one元素,这点十分简单..
};

 

转载于:https://www.cnblogs.com/jenry/archive/2010/12/08/1900572.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …

在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展?

在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展? 可以从三个层面考虑: (定级工作步骤:定级,备案,建设整改,等级测评,安全监管&…

PHP中文乱码的常见解决方法总结

PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身,有些产生在于MySQL交互的过程中,有时与操作系统有关。下面进行一番总结。 一.首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码&…

计算机网络技术期末考试复习总结

随便敲的一点复习资料 缩写题 WAN(广域网) LAN (局域网) MAN(城域网) PSE(分组交换器) PAD(分组组装/拆卸设备) NCC(网络控制中心) RT…

LYNC解决方案巡展

今天有幸参加了微软的LYNC解决方案巡展,也捕捉到一些镜头。和大家分享一下。 酒店入口的易拉宝。这个酒店的海鲜自助不错,可惜不是旋转餐厅。 微软中国及大中华区信息工作者业务群峰鹰巩的演讲。不过是纯英文的,没有翻译。我觉得微软在这些方…

计算机网络考试试题库-期末考试题库含答案

一、选择题(第一章 1-10;第二章 11-20;第三章21-35;第四章36-60 ;第五章 61-73道;第六章 74-84道;第七章85-90;第九章91-95;第十章96-100) 1.下列四项内容中,不属于Internet&#x…

Private Inheritance(what, where)

最近在看设计模式的时候,看到了私有继承,发现对这个概念挺模糊的,于是一顿搜索。发现一个不错的解释。红字我做的个人笔记,这是要点。 原文出处:http://tech.163.com/05/1124/14/23B2S17F0009159Q.html 在《C箴言&…

刑法中关于计算机犯罪的规定

1.《中华人民共和国刑法》中关于计算机犯罪的规定有三个条款:   第285条 违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处3年以下有期徒刑或者拘役。   第286条 违反国家规定,对计算机信息系统功…

巨额流量费其实可以避免

巨额流量费其实可以避免<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />“史上最贵微博”一度被人们热议。说是运营商的错&#xff0c;而运营商也很无奈&#xff0c;本来这种事情就非运营商所能掌控的。其实天价流量看似可怕其实…

转帖 .Net(C#)纯GDI+绘制实时动态曲线图之二(曲线控件全部源码)

#region 曲线数据显示 #region 绘制背景网格 /// <summary> /// 刷新背景网格线&#xff0c;并返回背景图片&#xff08;背景不判断是否滚动&#xff09; /// </summary> /// <returns>返回背景图片</returns> private System.Drawing.Bitma…

SQL Server语句

SQL简介&#xff1a; 结构化查询语言&#xff0c;全拼 Structured Query Language 主要用于对数据库的操作&#xff0c;大多数据库遵循sql原则 SQL server使用的是sql的扩展集T-SQL 全拼 Transact-SQL SQL组成&#xff1a; SQL由四部分组成分别为DML DDL DQL DCL DML:数据表操…

渗透测试岗位面试题(重点:渗透测试思路)

转载自公众号&#xff1a;alisrc 本文主要是讲解遇到问题的各思路解决方法&#xff0c;不仅可做为面试题查看&#xff0c;在实操中收到思绪的阻碍也可作为参考. 1、拿到一个待检测的站&#xff0c;你觉得应该先做什么&#xff1f;1)信息收集1&#xff0c;获取域名的whois信息,获…

Mysql5.1.36 autoinstall.sh

以下脚本由杨良伟同学一手编写&#xff0c;我只是为了其他文章方便转载才放进自己的文章&#xff0c;以下有附件可以下载&#xff0c;将txt改成sh&#xff0c;赋予执行位&#xff0c;即可执行自动安装&#xff0c;忘转载者标明出处&#xff0c;谢谢。 杨良伟同学blog链接: http…

春晓JAVA的横排和竖排输出

public class ChunXiao {public static void main(String[] args) {String a[][] { { "春", "眠", "不", "觉", "晓", "&#xff0c;" }, { "处", "处", "闻", "啼", &…

Android BroadcastReceiver应用

1. 创建Receiver&#xff0c;两种方式&#xff0c;动态和静态&#xff1a; &#xff08;1&#xff09;静态注册&#xff1a; 首先自定义个Receiver&#xff0c; publicclassMyReceiver extendsBroadcastReceiver { Override publicvoidonReceive(Context context, Intent…

JAVA “百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

public class BaiYuanBaiJi {public static void main(String[] args) {int x 0, y 0, z 0;//各种鸡的数量 xyz100(只) 5x3yz/3100(元)for (x 0; x < 20; x) {//全部买公鸡&#xff0c;最大是20只for (y 0; y < 33; y) {//全部买母鸡&#xff0c;最大是33只z 100…

mssql 2008恢复xp_cmdshell

EXEC sp_configure show advanced options, 1;RECONFIGURE;EXEC sp_configure xp_cmdshell, 1;RECONFIGURE; 关闭一样.只是将上面的后面的那个"1"改成"0"就可以了. EXEC sp_configure show advanced options, 1;RECONFIGURE;EXEC sp_configure xp_cmdshell…

用数组保存每个月份的天数,输出每个月有多少天。输入一个年份,输出该年份每个月的天数(提醒:闰年二月份多一天)

2、用数组保存每个月份的天数&#xff0c;输出每个月有多少天。 输入一个年份&#xff0c;输出该年份每个月的天数&#xff08;提醒&#xff1a;闰年二月份多一天&#xff09; import java.util.Scanner;public class TianShu {public static void main(String[] args) {int a[…

使用Symantec Altiris 来监控 Dell 服务器 的 硬件

最近一直在折腾DMC 监控 Dell 服务器&#xff0c; Altiris 6 对Dell的监控策略会丰富很多 &#xff0c;到了 7 严重缩水&#xff0c;6的策略又不能转化成7 ~~比较郁闷~~ 唯有自己去写不过最算给我写完了大部分常用的~~ 主要是 电源、电压、风扇、温度、处理器、内存、电池 等等…

从键盘输入四个数保存在数组中,找出最大、最小值 java

import java.util.Scanner;public class ZuiDaZuiXiao {public static void main(String[] args) {int a[] new int[4];Scanner s new Scanner(System.in);System.out.println("请输入4个数");//赋值数组for (int i 0; i < a.length; i) {a[i] s.nextInt();}/…