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 ...
随机推荐
- PHP两种实现无级递归分类的方法
/** * 无级递归分类 TP框架 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return strin ...
- Non-resolvable parent POM for com.*******
场景: 同事新打了一个jar包到私服里面,自己删除了本地对应的中央仓库的依赖包,再次重新下载. 于是我又打开了一个idea的窗口重新引入这个项目,然后重新下载依赖的服务. 结果就一直报这个问题... ...
- MySQL在线加字段实现原理
博客已转移到腾讯DBA博客 http://tencentdba.com/ 腾讯互娱内部维护了一个MySQL分支,基于官方5.5.24,实现了类似于Oracle 11g的快速加字段功能,这个分支我们内部 ...
- 类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型
类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型“Microsoft.Office.Interop.Word.Ap ...
- 进程间通信——队列和管道(multiprocess.Queue、multiprocess.Pipe)
进程: 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运 ...
- Aizu 2249 & cf 449B
Aizu 2249 & cf 449B 1.Aizu - 2249 选的边肯定是最短路上的. 如果一个点有多个入度,取价值最小的. #include<bits/stdc++.h> ...
- linux性能系列--网络
一.为啥网络监控不好做? 回答:网络是所有子系统中最难监控的了.首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内.这些因素包括,延迟.冲突.阻塞等 等.由于网络监控中, ...
- 翻译-QPKG开发工具快速开始指南
QPKG开发工具快速开始指南 指导你编译你自己的QPKG软件包 目录 什么是QDK 下载QDK 安装QDK 编译你自己的QPKG软件包 搭建QPKG编译环境 配置QPKG 定制QPKG程序 向QPKG ...
- Python的优雅写法
枚举 之前我们这样操作: Python 1 2 3 4 i = 0 for item in iterable: print i, item i += 1 现在我 ...
- Oracle Golden Gate概要
Oracle GoldenGate简介 Oracle Golden Gate用于源数据库与目标数据库的数据复制备份:可以在异构的环境(各种操作系统和数据库)之间实现数据亚秒级的实时复制备份:以及可以在 ...