浅谈javascript中的call()和apply()方法
话说在js中,每个函数都包含两个非继承而来的放方法,apply()和call(),使得我们能在特定的作用域中调用函数。
官方定义:
语法: fun.call(thisArg[, arg1[, arg2[, ...]]]
参数
thisArg
- 在
fun
函数运行时指定的this
值。
需要注意的是,指定的this
值并不一定是该函数执行时真正的this
值,如果这个函数处于非严格模式下,则指定为null
和undefined
的this值会自动指向
全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this
会指向该原始值的自动包装对象。 arg1, arg2, ...
- 指定的参数列表。
- -------------------------------------------------------------------------------------------------------------------------------------------------------------------
其实有一句我觉得特别经典的描述就是:
通过 call 方法,
你可以在一个对象上借用另一个对象上的方法,
咱先来谈谈其共同点:
先以call为例:
window.color = "red";
var o = {color: "blue"}; function sayColor(){
alert(this.color);
console.log(this);
} sayColor(); //red sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue在上面的代码中,分别调用了四次sayCokor()函数,第一次,直接调用,与第二个以当前this为对象调用(sayColor(this)),以及直接以window作为对象调用,都是指的当前window对象(可以理解为全局对象),返回window的color属性,而在第四次调用时,将对象o传了过去,此时sayColor方法所调用的color属性就是对象o的color属性了。
而对于apply():
其实现和call几乎一样,而两者区别在于,当函数需要传入参数时,apply()可以使用参数数组,而call()只能将参数一个一个的传过去。
例:
apply(this , [num1 , num2]);
call(this , num1 , num2);
具体使用环境也是依情况而定的。
说说他们的有点: 不需要对象和方法有任何耦合关系,一般来说,除了window对象以外,我们是很难去直接用对象去掉用和这个对象没有半毛线关系或同处于一个作用域内的方法的。
顺便添加一下最近用到的这两个函数的语句:
如何获取数组中的最大最小值:
var max2 = Math.max.apply(Math,values);吧Math对象作为apply()的第一个参数,从而正确的设置this值。
知识点补充:window对象,WEB浏览器一般讲全局变量作为window对象的一部分属性加以实现。因此,在全局作用域下声明的所有变量和函数,就都称为了window对象的属性。
浅谈javascript中的call()和apply()方法的更多相关文章
- 浅谈javascript中的call与apply方法
call方法与apply方法都是为了改变函数体内部this的指向. call方法与apply方法,这二者的作用完全一样,只是接受参数的方式不太一样. apply()方法: Function.apply ...
- 浅谈JavaScript中的call和apply
语法 fun.apply(thisArg, [argsArray]) fun.call(thisArg, arg1, arg2, ...) apply 接收两个参数,第一个参数指定了函数体内this对 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
- 浅谈JavaScript中的apply,call和bind
apply,call,bine 这三兄弟经常让初学者感到疑惑.前两天准备面试时特地做了个比较,其实理解起来也不会太难. apply MDN上的定义: The apply() method calls ...
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- 浅谈JavaScript中的内存管理
一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...
- 浅谈JavaScript中闭包
引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...
随机推荐
- oracle
转让日期格式字符串
字符串传递日期格式 SELECT trunc(to_date(SALE_MON,'yyyy-mm'),'y'),trunc(to_date(SALE_MON,'yyyy-mm'),'mm') FRO ...
- 使用bootbox.js(二级务必提交书面和数字到数字中国)
页面文件 <#-- 页头 --> <#assign currNav = "deposit"> <#assign title="网校充值&qu ...
- VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为"JAVA调用动态链接库DLL之JNative学习"中使用的DLL,仅仅是项目及文件名不同. ...
- localStorge它storage事件
随着h5患病率和mobile发展.localStorage它不再是一个陌生的词汇.我相信大多数童鞋进行了联系,并用它.但storage事件相信有很多童鞋不清晰甚至没有接触.今天我们主要谈storage ...
- 左右AjaxFileUpload背景返回Json治
项目中用到图片的无刷新上传,因此想到用ajaxUpLoadFile来解决. 第一步,先在上传图片的页面引入你下载到本地的ajaxfileupload.js文件. 文件下载地址:http://downl ...
- mumu血压计母亲节“拼团”盛大开幕,百度和厂家创造一个双赢的局面
在BAT的互联网时代.似乎不论什么新兴产品和服务都不能脱离BAT的支持,作为中国互联网体量最庞大的三家企业.BAT代表的是资源优势.用户优势.品牌优势.因此,一旦脱离BAT的支持,想迅速做大无 ...
- 一个demo
package com.entity; /*2015-7-18*/ public class Rover { private CurrentPosition position; public Rove ...
- 但从谈论性能点SQL Server选择聚集索引键
简单介绍 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是依照聚集索引的列作为keyword进行了. 因此对于聚集索引的选择对性能的影响就变 ...
- Android 获取屏幕大小和密度
Android 获取屏幕大小和密度 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay ...
- windows 10 install oracle 12c error:[ INS-30131 ]
"[ INS-30131 ] the Initial Setup That Is Required to Run the Installation Program Validation Wa ...