文档章节

关于js中call和apply的理解

stone_
 stone_
发布于 2014/12/04 15:02
字数 345
阅读 149
收藏 7

1. 方法定义。

call方法: 
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
定义:
调用一个对象的一个方法,以另一个对象替换当前对象。 
说明: 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

apply方法: 

语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

2. 实例

function add(a, b)
{
    console.log(a + b);
}
function sub()
{
    console.log(a - b);
}

add.call(sub, 3, 1);
//result: 4

  解析:js里面的方法都是对象。将add里面的this指针指向sub。所以结果还是 a + b

function Person()
{
    this.name = 'person';
    this.show = function()
    {
        console.log(this.name);
    }
}

function Worker()
{
    this.name = 'worker';
}

var p = new Person();
var w = new Worker();

p.show.call(w); //result: person

  解析:执行p对象里面的show方法,并把p对象里面的this指针指向w。

function Person(name)
{
    this.name = name;
    this.show = function()
    {
        console.log(this.name);
    }
}
function Worker(name)
{
    Person.call(this, name);
}

var w = new Worker('zhangsan');
w.show();

   



© 著作权归作者所有

stone_
粉丝 20
博文 221
码字总数 163611
作品 0
洛阳
程序员
私信 提问
趣谈js的call和apply两大召唤术

前言 在《趣谈js的bind牌胶水》这篇文章中,我聊到了js的bind胶水,这篇文章我来聊聊js的call和apply这对孪生兄弟。 Why? ——> 为什么会出现apply和call? 在《趣谈js的bind牌胶水》中,我...

hanmin
2018/05/21
0
0
关于javascript中apply()和call()方法的区别

如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言...

kisshua
2012/09/11
0
0
深入浅出 JavaScript 中的 this

在 Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象。一般在编译期确定下来,或称为编译期绑定。而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的,这就...

idea_biu
2012/09/05
0
0
JS每日一题: Call,Apply,Bind的使用与区别,如何实现一个bind?

20190115问: Call,Apply,Bind的使用与区别,如何实现一个bind? 相同点: 都是使用于方法借用及明确this指向场景 第一个参数都是this要指向的对象 都可以利用后续参数传参 不同点: 参数传递...

JS每日一题
01/23
0
0
每个JavaScript工程师都应懂的33个概念

摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:stephentian Fundebug经授权转载,版权归原作者所有...

Fundebug
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript……真香

写前端或者用 node 写命令行小工具一直采用的 es6 的语法,对于 TypeScript 则是秉持敬而远之的态度,毕竟团队中多推广一门语言所需要花费的精力都是让人望而却步的。所以对于 JavaScript 的...

郁也风
32分钟前
2
0
shell基本案例

1、自定义rm linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做...

寰宇01
39分钟前
2
0
分享一波 ZooKeeper 面试题

ZooKeeper是什么? ZooKeeper提供了什么? Zookeeper文件系统 ZAB协议? 四种类型的数据节点 Znode Zookeeper Watcher 机制 -- 数据变更通知 客户端注册Watcher实现 服务端处理Watcher实现 ...

搜云库技术团队
53分钟前
1
0
谈谈你对volatile的理解

1、volatile是Java虚拟机提供的轻量级的同步机制 -保证可见性 -不保证原子性 -禁止指令重排 2、JMM你谈谈 JMM(Java内存模型,简称JMM)本身是一种抽象的概念并不真实存在 ,它描述的是一组规...

一只小青蛙
今天
2
0
Redox OS 发布 0.5 版

Redox OS 是一个几乎完全以 Rust 语言编写的通用操作系统及周围生态(例如文件系统、显示服务器及 Rust 版本的 libc)。其遵循微内核架构,在一定程度上兼容于 POSIX。 该项目于日前发布了 ...

linuxCool
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部