JavaScript中的this详解(彻底弄懂js中的this用法)!
要想学好js,那么其中那些特别令人混淆迷惑的知识点,就一定要弄清楚。this关键字就是其中让初学者比较迷惑的知识点之一,不过灵活运用this可以提升代码的性能和复用性,那么今天我就和大家一起来了解this的具体情况,
首先this作为关键字,它的作用就是引用,并且它通常只写在函数内部就是函数体内,在js中this的引用对象随着函数的使用环境变化而变化,好在具体的使用环境并不多,基本就四种。分别是普通函数、构造函数、对象属性、apply&call方法。
一、普通函数中的this
所谓普通函数,就是写在全局环境中,并且不属于构造函数、对象属性、调用过apply&call方法的任意一种情况。我们平时写的普通的方法和功能基本都是普通函数。普通函数中的this都引用window对象
//function关键字声明的普通函数
function fn1(){
console.log(this);
};
fn1();//执行结果:window{...} //函数表达式形式的普通函数
var fn2=function(){
console.log(this);
}
fn2();//执行结果:window{...}; //访问全局属性,
var x=10;
function fn3(){
console.log(this.x)
}
fn3();//执行结果 10 //普通函数中的this,和全局环境中this是一样的
var x=10;
console.log(this)//执行结果 window{...}
console.log(this.x)//执行结果 10
二、构造函数中this
构造函数与普通函数的区别就是,构造函数的目的是用来构造对象的,类似Java中的class ,构造对象的方式就是使用new 关键字 ,如何通过构造函数给对象添加属性?就是使用this关键字,所以构造函数中的this指向的是它实例化的对象
//写一个构造函数
function person(){
this.sex='female';
this.age=''20'
};
var xiaoming=new person();//js在执行到此条语句时,将this的引用指向了xiaoming
console.log(xiaoming.age),//执行结果 20 //需要注意的是 如果直接执行构造函数,而不是new 一下,那么this还是指向window
function person(){
this.sex='female';
this.age=''20';
console.log(this)
};
person();//执行结果 window{...}
三、apply方法和call方法
this这么强大,不好好利用怎么对得起js属于高级语言的行列。js提供了可以自主更改this的指向的方法。玩转高级js ,不知道apply 和call方法怎么行。apply 和call方法,是所有函数类型的原生方法,和数组的split(),push() 一样,不需要另外声明直接可以用的方法。函数调用call()、apply()方法后,this的引用为call apply 方法传进去的第一个参数
//先来一个call
var a={
c:0,
b:1
};//定义一个对象
function fn1(){
console.log(this)
};
fn1.call(a)//执行结果:{c:0,b:1} //call apply 的功能一样,唯一不同的是传给函数的参数的方式(就是第二个参数开始,第一个参数是this指向的新对象)
//apply 传数组,这个数组包含函数所需要的参数,call 直接传参数
var a={
c:0,
b:1
};//定义一个对象,用来做call和apply的第一个参数
function fn2(arg1,arg2){
console.log(this)
console.log(arg1+arg2)
};
fn2.call(a,1,1)//执行结果{c:0,b:1} 2
fn2.apply(a,[1,1]);//执行结果{c:0,b:1} 2
fn2.apply(a,1,1)//报错 //其实还有一个bind方法.bind方法和call使用方式一样,作用也一样,不一样的是实现方式,call传参结束后直接执行函数(apply也是),而bind只是更改this值和给函数传参,函数并不执行
,所以bind可以作为事件的处理函数去使用
//比如给div绑定一个click事件
div.onclick=fn.call(obj,arg1,arg2)//这样不待div点击fn就已经被执行了
div.onclick=fn.bind(obj,arg1,arg2)//这样当div被点击时才会有效
四、作为对象的属性
js中的对象概念,也值的花大篇幅去介绍,再此不做赘述,这里讨论的对象只是js特有的对象格式(用大括号包括,以键值对的形式表示属性和属性值,并且每个属性用逗号隔开),js函数也可以作为对象的属性值,这个时候作为对象属性值的函数,其内部this指向的就是这个对象
var obj={
x:1,
y:function(){
console.log(this);
console.log(this.x)
}
};
obj.y;//执行结果 {x:1,y:fn} 1 //需要注意的是,如果函数不是作为对象属性的属性值被调用,而是作为属性值赋值给其他变量,则此函数中的this不再指向该对象
var obj={
x:function(){ console.log(this) }}
var z=obj.x;//作为属性值赋值
z();//执行结果 window{...} //利用此原理,我们可以将一个函数供给两个对象使用
obj1.fn=obj2.fn=function(){
console.log(this)
}
//这样obj1,和obj2就都有一个fn属性,这个属性值是一个函数,并且这个函数中this指向的对象分别obj1 ,obj2
//大名鼎鼎的jQuery很多地方都用了这样的方式,有兴趣的同学可以看看jQuery源码
写到这了,this的用法就基本描述完了,也许this还有其他更高级更优秀的用法,那就需要各位自己去探索,总结了。总之学海无涯,需要我们一点一滴的积累,切不可急躁。
JavaScript中的this详解(彻底弄懂js中的this用法)!的更多相关文章
- ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route
前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...
- 让你弄懂js中的闭包
目录 闭包 闭包如何产生 闭包是什么 常见的闭包 闭包的作用 闭包的生命周期 闭包的应用 闭包的缺点 内存泄露 内存溢出 闭包面试题 闭包 之前在我执行上下文执行上下文栈这篇文章中,出现了这样一个题目 ...
- 彻底弄懂JS中的this
首先,用一句话解释this,就是:指向执行当前函数的对象. 当前执行,理解一下,也就是说this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定.this到底指向谁?this的最终指向的 ...
- JavaScript进阶内容——BOM详解
JavaScript进阶内容--BOM详解 在上一篇文章中我们学习了DOM,接下来让我们先通过和DOM的对比来简单了解一下BOM 首先我们先来复习一下DOM: 文档对象模型 DOM把文档当作一个对象来 ...
- Python中time模块详解
Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
设计dapm的主要目的之一,就是希望声卡上的各种部件的电源按需分配,需要的就上电,不需要的就下电,使得整个音频系统总是处于最小的耗电状态,最主要的就是,这一切对用户空间的应用程序是透明的,也就是说,用 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
随机推荐
- Android 线程池的类型、区别以及为何要用线程池
每个 Android 应用进程在创建时,会同时创建一个线程,我们称之为主线程,负责更新 UI 界面以及和处理用户之间的交互,因此,在 Android 中,我们又称之为 UI 线程.一个进程中 UI 线 ...
- prince2的市场使用规模有多大?
PRINCE2的使用和应用非常广泛.在过去的12个月里,超过60,000人参加了PRINCE2基础资格(Foundation)或从业资格(Practitioner)考试.现在每周参加考试的人数超过了2 ...
- Maven 安装 eclispe
-Dmaven.multiModuleProjectDirectory=$M2_HOME
- zabbix连不上数据库
[root@localhost etc]# tail -f /var/log/zabbix_server.log 1267:20130722:195451.493 [Z3001] connection ...
- SpringMVC中使用DispatcherServlet
接触Web开发的时候我们会利用Servlet来接收和转发前端页面的各种请求,我们通常会在一个页面中对应一个Servlet来处理这个页面上和用户交互的信息,通常我门遇到5个以内的页面自己来写Servle ...
- time random sys 模块
time模块 顾名思义就是时间模块 我们在之前就用过一些时间模块 比如你想要让打印的时间延迟就time.sleep() 首先我们知道这是一个时间操作的模块 它可以分为三种模式:时间戳模式.格式化时间模 ...
- [翻译] MagicPie
MagicPie Powerful pie layer for creating your own pie view. PieLayer provide great animation with si ...
- 省钱小贴士(ECS):教你如何每年省出8w+ 块
随着用户越来越多地使用阿里云的ECS服务,如何用最小的成本来保有ECS,成为用户越来越重要的关注点. 变更点 为了更好的服务客户,ECS团队调整了系统盘的最小容量限制 linux系统 core os调 ...
- [BZOJ 2730][HNOI 2012] 矿场搭建
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2113 Solved: 979[Submit][Statu ...
- XML序列化 System.Xml.Serialization
一.定义元数据 XML序列化常用属性:XMLRoot,XMlType.XMLText.XMLEnum等 [Serializable] [XmlRoot] public class Product { ...