JS函数与call()apply()详解
JavaScript中的每个函数都是一个对象。
因为函数都是对象,它们有自己的属性和方法。我们可以把它们看作数据(data)。
函数和方法的区别?
函数立足于它们自己(例如:alert()),
而方法是函数内部一个对象的属性(dictionary),我们通过对象来调用方法。
每个JavaScript函数都会有很多附属的(attached)方法,包括toString()、call()以及apply()。
定义了一个全局函数f()。f()通过this关键字访问变量x,
var x = ;
function f(){
alert(this.x);
}
f();
function p(){
var x=100;
alert(x);
}
p();
注意:我们不能通过一个对象的实例来调用这个函数。
this指向的是什么对象呢?this会指向这个全局对象。我们的变量x就是在这个全局对象中定义的。
上面的代码能够正常运行,运行结果会显示一个对话框,对话框中显示10。 第二个函数 输出100,函数内部属性
js里call函数改变对象指针,指向另一个对象调用
var x = ;
var o = { x : };
function f(){
alert(this.x);
}
f();
f.call(o);
首先调用f()将会显示10的对话框,因为this这个时候指向的是全局对象。
然后我们调用f函数的call()方法,传入的参数是o,运行结果显示的是o中x属性的值15。
call()方法会用它的第一个参数作为f函数的this指针。也就是说,我们会告诉运行时,f函数中的this指向的是哪个对象。
call传入参数
<script type="text/javascript">
var x = ;
var o = { x : };
function f(y){
alert(this.x); this指O对象
alert(y);
} f.call(o,this.x); this指全局对象属性10
</script>
<script language="javascript"><!--
/**定义一个animal类*/
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
/**定义一个Cat类*/
function Cat(){
this.name = "Cat";
}
/**创建两个类对象*/
var animal = new Animal();
var cat = new Cat();
animal.showName.call(cat,",");
//通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。
//输入结果为"Cat"
</script>
call函数实现对象继承
<script language="javascript"><!--
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
} function Class2()
{ Class1.call(this);
} var c2 = new Class2(); c2.showTxt("cc");
</script>
c2对象可以具有了 Class对象的所有方法
apply()函数
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)
对应的apply写法为:func.apply(func1,[var1,var2,var3])
JS函数与call()apply()详解的更多相关文章
- JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function
html +css 静态页面 js 动态 交互 原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向 ...
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
- js中鼠标滚轮事件详解
js中鼠标滚轮事件详解 (以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ ) 之前js 仿Photoshop鼠标滚轮控制输入框取值中已使用 ...
- 微信JS接口汇总及使用详解
这篇文章主要介绍了微信JS接口汇总及使用详解,十分的全面.详尽,包含分享到朋友圈,分享给朋友,分享到QQ,拍照或从手机相册中选图,识别音频并返回识别结果,使用微信内置地图查看位置等接口,有需要的小伙伴 ...
- js中中括号,大括号使用详解
js中中括号,大括号使用详解 一.总结 一句话总结:{ } 是一个对象,[ ] 是一个数组 1.js大括号{}表示什么意思? 对象 { } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或 ...
- js对象浅拷贝和深拷贝详解
js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...
- PHP函数call_user_func和call_user_func_array详解
今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...
- ext.js的mvc开发模式详解
ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...
- WordPress函数:get_bloginfo()用法详解
描述 返回你博客的信息,这些信息可以用在任何地方的 PHP 代码中.这个函数,和 bloginfo() 一样,可以用来在模板文件的任何地方显示你博客的信息. 用法 <?php $bloginfo ...
随机推荐
- Facebook 开源三款图像识别人工智能软件
Facebook今天开源了三款人工智能图像分割(Image Segmentation)软件,分别是DeepMask.SharpMask和MultiPathNet,三款工具相互配合完成一个完整的图像识别 ...
- Windows系统编程之进程间通信
Windows系统编程之进程间通信作者:北极星2003来源:看雪论坛(www.pediy.com)Windows 的IPC(进程间通信)机制主要是异步管道和命名管道.(至于其他的IPC方式,例如内存映 ...
- Codeforces Round #312 (Div. 2) A.Lala Land and Apple Trees
Amr lives in Lala Land. Lala Land is a very beautiful country that is located on a coordinate line. ...
- 用SQL替换最后一个指定字符后面的所有字符
下面给出任意字符串,该字符串长度未定,只知道该字符串有许多个‘-’连接起来的,现在要把最后一个‘-’后面的字符替换掉为指定串. 假如字符串为:'x1253-axebx-xcdx-o9kgl-3ddll ...
- JS调试工具
IE http://msdn.microsoft.com/zh-cn/library/ie/dn255003(v=vs.85).aspx FF http://www.wumii.com/item/1g ...
- 怎么都没人提 google 加密搜索呢? google如何稳定打开
1. 使用smarthosts提供的hosts文件 https://smarthosts.googlecode.com/svn/trunk/hosts2. 修改浏览器默认搜索引擎为 https://e ...
- 尚学堂 JAVA Day1 概念总结
1.什么是计算机语言?一些符号,这些符号按照计算机硬件结构可以理解的方式排列组合,方便人与计算机,计算机与计算机之间进行信息的交换. 2.什么是机器语言?就是简单的二进制0和1的组合.该语言是计算机硬 ...
- jQuery Ajax 的 load()方式
load() 方法 load() 是所有jQuery工具中最简单的,向它传入一个URL,它会异步加载URL内的内容,然后将内容插入每一个选中元素中,替换掉已经存在的任何内容. 例如 $(" ...
- Cocos2D-X2.2.3学习笔记12(瞬间动作)
到眼下我们已经学习了有 坐标系统 内存管理 UI系统 事件处理 几何图形 今天我们来学习动作管理OK 我们来看看类结构图 CCAction 全部动作的基类 以下派生了三个子类:CCFiniteTi ...
- linux下mysql5.5的安装
#rpm –qa|grep –i mysql查看已安装的mysql版本 如果有已存在的mysql版本则删除 安装服务端和客户端,去Oracle官网下载: # rpm -ivh MySQL-serve ...