javascript中this,call,apply详解
javascript是一门解释型的语言,与很多面向对象语言相比有着不同特性,所以不能用面向对象的原理来理解this这个关键字。
在JS中,要真正理解this倒底指向哪个对象,必须先了解JS的作用域和原型链的原理。简单的说,this是与运行时的执行环境绑定的。在使用它时,我们是无法确定其this指向哪个对象,只有当真正调用时,this才会指向所调用的对象。如以下代码
var a="hi";
alert(this.a);
结果很明显,弹出一个"hi"窗口提示。
//var a="hi";
alert(this.a);
弹出一个"undefined"窗口提示。
上面两种结果,是由于JS默认作用域是window,即a在运行时指向的是当前window这个对象,前者window存在a这个实体属性,而后者没有。
那么再看一下下面例子
var a ="hi";
function say()
{
alert(this.a);
}
say();
弹出一个"hi"窗口提示。
//var a ="hi";
function say()
{
alert(this.a);
}
say();
弹出一个"undefined"窗口提示。
//var a ="hi";
function say()
{
var a="say hi";
alert(this.a);
}
say();
弹出一个"undefined"窗口提示。
//var a ="hi";
function say()
{
a="say hi";
alert(this.a);
}
say();
弹出一个"say hi"窗口提示。
以上四个例子中,this虽然定义在say这个函数下,但函数的调用对象还是windows,1和2理解和上两个例子差不多,第3和第4则是由于作用域导致的。第3个a的作用域在仅函数里,第4中a的作用域为window(未定义直接初始化,变量作用域属于它的调用对象)。
再来点示例:
function say()
{
this.a="say hi";
}
var who= new say();
alert(who.a);
弹出一个"say hi"窗口提示。
以上这个例子在运行时,this指向的是who这个实体,如果直接运行say()那么结果将是弹出一个"undefined",因为say()只是个函数(相当于面向对里里面的类),而new say()是一个对象,相当于面向对象里的类的实例。
说完this,下面再来整下JS里在很多框架内部源码经常看到的两个常用关键字:call.apply。其它这两个方法可以说是一个功能,只是传的参数形式不一样, xxFunction.call(A,arg,arg),xxFunction.apply(A,args)。简单的说就是调用对象来执行方法。作用,运行时辅助操作对象,常用于继承操作。
如下列代码:
function User(name){
this.name=name;
}
function Coder(name){
User.call(this,name);
this.skill="Code";
}
var coder = new Coder("xiaoming");
alert(coder.name+"擅长"+coder.skill);
Code继承于User,并有自己的skill属性。
javascript中this,call,apply详解的更多相关文章
- javascript中的this作用域详解
javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...
- javascript中=、==、===区别详解
javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- JavaScript中this的用法详解
JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
- JavaScript中的注释问题详解? 部分3
注释:解释代码的含义,浏览器中不执行. 方便其他程序员了解代码 ,也可以注释自己不需要的代码(开发过程中)! 1. 单行注释 // 用于一行代码上面 2.多行注释 /* */ 用于一段代码上面 或者是 ...
- JavaScript中的async/await详解
1.前言 async函数,也就是我们常说的async/await,是在ES2017(ES8)引入的新特性,主要目的是为了简化使用基于Promise的API时所需的语法.async和await关键字 ...
- Javascript中prototype属性的详解
原文链接:http://www.cnblogs.com/Uncle-Keith/p/5834289.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象 ...
随机推荐
- oracle spoof用法
关于SPOOL(SPOOL是SQLPLUS的命令,不是SQL语法里面的东西.) 对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如: select taskindex|| ...
- UIView的clipsTobounds属性
这里的clip是修剪的意思,bounds是边界的意思,合起来就是:如果子视图的范围超出了父视图的边界,那么超出的部分就会被裁剪掉.该属性在实际工程中还是非常实用的,必须要了解清楚.
- <转>golang 并发性能数据
1.管道chan吞吐极限10,000,000,单次Put,Get耗时大约100ns/op,无论是采用单Go程,还是多Go程并发(并发数:100, 10000, 100000),耗时均没有变化,Go内核 ...
- Git学习笔记:Git基础
一.Git与其他版本控制系统的差别 Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异.这类系统每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容.如下图,其他 ...
- 从汇编看c++的new和delete
下面是c++源码: class X { private: int _x; public: X() : _x(xx) {} ~X() {} }; int main() { X* xp = new X; ...
- 多行文本垂直居中div高度确定
父元素高度确定的多行文本.图片.块状元素的垂直居中的方法有两种: 方法一:将内容写入table(包括tbody.tr.td)中的td标签里,同时设置 vertical-align:middle. cs ...
- CentOS minimal版安装图形界面的步骤(自动获取IP)
1.连接网络: CentOS minimal.iso安装好后,进入终端,默认是不开网络的, 首先启用网卡, 自动获取ip. ifconfig eth0 up www.2cto.com dhcli ...
- CentOS查看CPU、内存、网络流量和磁盘 I/O
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/swrqm/s: 每秒进行 merge 的 ...
- Python学习笔记(五)Python的切片和迭代
切片 Python提供了切片操作符,可以对list.tuple.字符串进行截取操作. list中的切片应用 语法如下: >>> L = ['Michael', 'Sarah', 'T ...
- swift笔记06
for in循环 for 被乘数 in 1...5{ println("\(被乘数) 乘以 5 等于 \( 被乘数 * 5)"); } let 女神们 = ["小林&q ...