javascript call与apply关键字的作用
apply接受两个参数。第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合。
call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数。
|
1
2
3
4
5
6
|
var func = function(a,b,c){ alert(a + b + c);}func.apply(null,[1,2,3]);//弹出6func.call(null,1,2,3);//弹出6 |
当apply与call传入的第一个参数为null时,函数体内的this会指向window。
call与apply的用途
1、改变this的指向
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var obj1 = { name = '刘备'}var obj2 = { name = '曹操'}var getName = function(){ alert(this.name);}window.name = '三国';getName();//弹出"三国"getName.call(obj1);//弹出"刘备"getName.call(obj2);//弹出"曹操" |
所以,当在一些情况下this被莫名改变指向之后,可以使用call或apply来进行修正this的指向。
|
1
2
3
4
5
6
7
|
document.getElementById('div1').onclick = function(){ alert(this.id);//div1 var fun1 = function(){ alert(this.id);//window.id 即undefined } fun1();//普通函数的方式调用,this指代window,相当于window.id 即 undefined} |
由于是普通函数的方式调用,所以上面的例子中,this已经变成了window。下面看看如何使用call进行修正。
|
1
2
3
4
5
6
7
|
document.getElementById('div1').onclick = function(){ alert(this.id); var fun1 = function(){ alert(this.id); } fun1.call(this);//强制函数内的this为外层的this,} |
2、调用其他对象的函数
示例1:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var obj1 = { a:1, b:2, add:function() { return this.a + this.b; }}var obj2 = { a:1, b:2,}var result = obj1.add.call(obj2);//用obj1的函数来计算obj2的两个属性的和alert(result);//输出3 |
示例2:借用构造函数实现类似继承的效果
|
1
2
3
4
5
6
7
8
9
10
11
12
|
var A = function(name){ this.name = name;};var B = function(){ A.apply(this,arguments)}B.prototype.getName = function(){ return this.name;}var b = new B('刘备');alert(b.getName()); |
javascript call与apply关键字的作用的更多相关文章
- JavaScript中的this关键字的用法和注意点
JavaScript中的this关键字的用法和注意点 一.this关键字的用法 this一般用于指向对象(绑定对象); 01.在普通函数调用中,其内部的this指向全局对象(window); func ...
- javascript篇-----函数apply()和call()
转自:http://www.jb51.net/article/28013.htm 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的 ...
- 转载 深入理解JavaScript中的this关键字
转载原地址: http://www.cnblogs.com/rainman/archive/2009/05/03/1448392.html 深入理解JavaScript中的this关键字 1. 一 ...
- 《JavaScript总结》apply、call和bind方法
在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...
- JavaScript中的apply()和call()
可以将call()和apply()看做是某个对象的方法,通过调用方法的形式来间接调用函数. call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对 ...
- 如何理解JavaScript中的this关键字
前言 王福朋老师的 JavaScript原型和闭包系列 文章看了不下三遍了,最为一个初学者,每次看的时候都会有一种 "大彻大悟" 的感觉,而看完之后却总是一脸懵逼.原型与闭包 可以 ...
- return 关键字的作用
注意: 如果一个函数的返回值类型是具体的数据类型,那么该函数就必须要保证在任意情况下都保证有返回值.(除了返回值类型是void以外) return 关键字的作用: 1. 返回数据给函数的调用者. 2. ...
- Linq中关键字的作用及用法
Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...
- Java对象表示方式1:序列化、反序列化和transient关键字的作用
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
随机推荐
- 想让你的java代码更漂亮,用枚举吧
枚举是java 5之后添加的一个重要特性,这个特性不能提高性能,但是能让java程序员写出更优雅的代码. 我之前看到过挺多介绍java枚举的不错的帖子,我也来参与以下这个话题. 1. 枚举基本用法 / ...
- JSBInding+Bridge.NET:把C#编译为Js
编译步骤: 1. 用 VS 2015 打开 BridgeProj/BridgeProj.sln ,编译 2. 将生成 BridgeProj/Bridge/output/bridge.js,对应于 Br ...
- Linux-Rsync服务器/客户端搭建实战
一.需求 每晚汇总各机器的操作日志,同步到主服务器进行日志分析. 二.基础知识 rsync 分为服务器端.客户端,服务器端搭建比客户端辛苦一些(也是很简单). rsync 服务器是指以 deamon ...
- C#调试心经(1)(转)
我们在做程序开发时,难免会遇到错误异常.如何快速地找到出错的地方.分析错误的原因以及找到解决问题的方案,是许多初级程序员困扰的问题,这也正是经验的宝贵之处.下面我将简单介绍在Visual Studio ...
- centos虚拟机网络配置
修改IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes BOOTPROTO=dhcp service network restart ...
- Web 前端开发学习之路(入门篇)
字数1374 阅读4622 评论0 喜欢49 以前学习过一段时间的web前端开发,整理了一些我看过的/我认为比较好的学习资料(网站.书籍).不要问我为啥没有进阶版,我只是一条产品汪而已,求轻喷.== ...
- LeetCode "Arranging Coins"
A simple math.. take care of data overflow though. class Solution { public: int arrangeCoins(int n) ...
- LeetCode "Wiggle Subsequence" !
Another interesting DP. Lesson learnt: how you define state is crucial.. 1. if DP[i] is defined as, ...
- WPF中TreeView的使用
因为项目中需要用到TreeView控件,由于是第一次在WPF中用到,因此事先在网上搜了很多关于数据绑定的方法介绍,个人经过实际应用,觉得WPF中的HierarchicalDataTemplate定义模 ...
- Linux系统的压缩技术
1.常见的压缩文件扩展名 *.Z ---> compress程序压缩的文件. *.gz --->gzip 程序压缩的文件: *.bz2------>bzip2程序压缩的文件: *.t ...