浅谈JavaScript中的call和apply
语法
fun.apply(thisArg, [argsArray]) fun.call(thisArg, arg1, arg2, ...)
apply 接收两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为带下标的集合,这个集合可以为数组,也可以为类数组,apply 方法把这个集合总的元素传递给被调用的函数。
call是包装在apply上的语法糖,如果知道具体多少个参数,可以使用call来传递参数,方便表达形参和实参的对应关系。
往往apply和call容易记混淆,不妨使用联想记忆:
apply ->array //字母开头都是a
只要看到apply就会想到接收的是array。apply接收数组或类数组对象,而call接收参数列表。
用途
1.改变this的指向
简单来说就是当 fun函数运行时,指定this的值 为 thisArg。
var a = 10,b = 20;
function add(c,d){
return this.a + this.b + c +d;
} var o ={a:1,b:2}; add(3,4); // 10 + 20 + 3 + 4 = 37
add.call(o,3,4); // 1 + 2 + 3 + 4 = 10
add.apply(o,[3,4]); // 1 + 2 + 3 + 4 = 10
上面的例子可以看出
当直接调用add时,this指向 window;
当使用call、apply时,this指向了o;
2.借用其他对象方法
当一个object对象没有某个方法,可以借助call或apply用其它对象的方法来实现。
function Cat(){
}
Cat.prototype = {
voice:"miao~miao~",
say: function () {
console.log("I can say "+ this.voice);
}
};
var writeCat = new Cat();
writeCat.say(); // I can say miao~miao~
//dog
var yellowDog = {voice:"wang~wang~"};
writeCat.say.call(yellowDog); // I can say wang~wang~
关于thisArg
thisArg 是对象类型。
当指定的thisArg不是对象类型时,会先转成相应的对象类型,再进行后续程序。
function foo(x,y){
console.log(x,y,this);
}
foo.call(100,1,2); // 1 2 Number {}
foo.call(true,1,2); // 1 2 Boolean {}
foo.call('string',1,2); // 1 2 String { 0="s", 1="t", 2="r", 更多...}
foo.call(null); //undefined undefined Window
foo.call(undefined); //undefined undefined Window
当指定为null和undefined时,函数内的this会指向默认的宿主对象,在浏览器里是Window,但当在严格模式时,则不进行转化。
浅谈JavaScript中的call和apply的更多相关文章
- 浅谈javascript中的call()和apply()方法
话说在js中,每个函数都包含两个非继承而来的放方法,apply()和call(),使得我们能在特定的作用域中调用函数. 官方定义: 语法: fun.call(thisArg[, arg1[ ...
- 浅谈javascript中的call与apply方法
call方法与apply方法都是为了改变函数体内部this的指向. call方法与apply方法,这二者的作用完全一样,只是接受参数的方式不太一样. apply()方法: Function.apply ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- 浅谈JavaScript中的内存管理
一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...
- 浅谈JavaScript中闭包
引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...
- 浅谈JavaScript中的Function引用类型
引言 在JavaScript中最有意思的就是函数了,这一切的根源在于函数实际上是一个对象.每一个函数都是Function类型的实例,而且都和其他引用类型的实例一样具有属性和方法.函数作为一个对象,因此 ...
随机推荐
- Flex自定义组件开发之日周月日期选择日历控件
原文:Flex自定义组件开发之日周月日期选择日历控件 使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的 ...
- TCP流量控制协议
说明: 本文仅供学习交流.转载请标明出处,欢迎转载! 本文是下面文献相关内容的总结 [1] <TCP/IP具体解释 卷1:协议> [2] <TCP/IP协议族 第4版> [3] ...
- 多层次的Json字符串转化为对象
using Arvato.CRM.DataTrans.ConsoleHost.Model;using System;using System.Collections.Generic;using Sys ...
- Objective-C马路成魔【12-分类和协议】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 分类与协议 ...
- STL该反应堆运行
首先来看全然二叉树的定义: 若设二叉树的深度为h,除第 h 层外,其他各层 (1-h-1) 的结点数都达到最大个数,第 h 层全部的结点都连续集中在最左边,这就是全然二叉树.而将一维数组视为全然二叉树 ...
- Codeforces 461B Appleman and Tree(木dp)
题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...
- Asp.net MVC + EF + Spring.Net 项目实践(一)
准备用几篇文章来做一个MVC的例子,为了给新同事做参考,也为自己做个知识储备. 首先,用VS2013创建一个空白解决方案StudentManageSystem,然后添加一个MVC应用程序(可参考ASP ...
- Zend Server更新至6.2版本——虚拟主机全方位管理
Zend Server自从发布6.0以来,并支持云服务,成为很多PHP程序所选择的Web服务器. Zend Server 6.2版本从更新内容来看,解决了Web服务器与虚拟主机之间的协同管理.并在细节 ...
- js 图片点击放大功能
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Solr 教程
1.Solr安装 下载jdk-8u111-windows-i586_8.0.1110.14 下载solr-6.3.0.zip 2.配置JAVA_HOME 在"系统变量"中,设置3项 ...