call( )和apply( )都是为了改变某个函数运行时的上下文而存在的.换句话说是改变函数体内部this的指向

他们的区别就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组

来个栗子:

function cat(){};
cat.prototype ={
food:'fish',
say:function(){
alert("I love"+this.food);
}
} var blackCat = new cat();
blackCat.say(); //I love fish //这时有一个新对象
whiteDog = {food:'bone'};
//我们想要它也会说话,但是不想重新定义say方法,我们可以借用cat的方法.
blackCat.say.call(whiteDog);// I love bone

在这个例子中,call改变了blackCat.say()这个函数的运行时的上下文.

call前面的是要执行的函数,第一个参数是目标函数运行上下文.从第二个开始是传入的参数.

至于何为运行时的上下文,我认为指的其实是两个概念,执行环境和变量对象,详情可到"执行环境及作用域"一文中查看.

再来一个例子

function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
} add.call(sub,3,1);//4

这个例子曾经困扰我很久.为什么是4不是2?

敲黑板 : call( )改变的是函数运行时的上下文,上下文,上下文.在这个例子中,不管是函数add还是sub他们的上下文是相同的啊,都是运行在全局作用域下.函数add的上下文并没有被改变,所以该怎么执行还怎么执行喽.

来个用的比较多的,用的比较多的,通过document.getElementsByTagName选择的dom节点是一种类似array的array。它不能应用Array下的push,pop等方法。

我们可以通过var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));这样domNodes就可以应用Array下的所有方法了。

call()和apply()的作用的更多相关文章

  1. call, apply, bind作用

    call, apply作用就是(改变方法中的this指向)借用别人的方法来调用,就像调用自己的一样 function Person(name) { this.name = name; } Person ...

  2. JS基础:this的指向以及call、apply的作用

    this 的指向 在具体的实际应用中,this 的指向无法在函数定义时确定,而是在函数执行的时候才确定的,根据执行时的环境大致可以分为以下3种: 1.当函数作为普通函数调用时,this 指向全局对象 ...

  3. call() 和 apply() 的作用和区别

    call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就 ...

  4. 快速理解js中的call,apply的作用

    今天被人问到js中的call,apply的区别和用途,解释了一番后,想到之前在逼乎上看到一位小伙伴生动形象的解释 本身不难理解,看下MDN就知道了,但是不常用,遇到了,还要脑回路回转下.或者时间长了, ...

  5. call、apply的作用和区别是什么?

    call().apply()的区别: 相同点: 1.call()和apply()都可以用来间接调用函数,都可以显式调用所需的this.即,任何函数可以作为任何对象的方法来调用. 2.两个方法都可以指定 ...

  6. js中call和apply的作用和用法

    call和apply的用途是完全一样的.改变函数中this的指向: 为什么要改变this的指向呢?这个有什么用?有哪些场景呢? 首先this的指向总是在变的,this的指向是由函数执行时所在的环境决定 ...

  7. call和apply的作用实例

    <script> var scopeTest = function(){ //考察了 this 的含义 window.a=2; function fn(b){ this.b = b; co ...

  8. JS中bind、call和apply的作用以及在TS装饰器中的用法

    目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...

  9. 面向对象的JavaScript-006-Function.prototype.apply()的3种作用

    1. // Function.prototype.apply()的作用 // 1.Using apply to chain constructors Function.prototype.constr ...

随机推荐

  1. XSS分析及如何预防

    XSS分析及如何预防 简单说明: XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开 ...

  2. Eclipse常用快捷键记录

    Eclipse简介: Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的 ...

  3. GCC和G++区别

    原文:http://www.cnblogs.com/samewang/p/4774180.html 看的Linux公社的一篇文章,觉得不错,内容复制过来了. 其实在这之前,我一直以为gcc和g++是一 ...

  4. jumpserver-0.3.2 堡垒机环境搭建(图文详解)

    下载安装包:https://github.com/jumpserver/jumpserver.git 解压 三.执行快速安装脚本 cd /opt/jumpserver/install pip inst ...

  5. 在centos6上实现编译安装lamp和wordpress,并编译xcache

    author:JevonWei 版权声明:原创作品 软件环境: centos6.9 httpd-2.4.27.tar.bz2 apr-1.5.2.tar.bz2 apr-util-1.5.4.tar. ...

  6. java设计模式系列之设计模式概要(1)

    一.什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  7. 日志log4j配置详情,日志log具体到你想不到

    一.Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局). 1.LoggersLoggers组件在此系统中被分为五个级别:DEBU ...

  8. Python 进程与线程小随笔

    Process 涉及模块:multiprocessing Process p = Process() p.start() p.join() from multiprocessing import Pr ...

  9. 玩转PS路径,轻松画logo!

    轻松画图标!教你一分钟玩转PS路径描边 推荐: cyRotel    2014/11/24    in PS 教程 & 设计文章    @Micu设计 :Photoshop的路径工具和钢笔工具 ...

  10. JavaScript 的使用基础总结②DOM

    HTML DOM 通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HT ...