Javascript 中的 call 和 apply使用介绍

 更新时间:2012年02月22日 15:40:38   作者:  
JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象
简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。
call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。
apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,参数可以是数组或者arguments 对象。
这两个方法通常被用来类的继承和回调函数:
作用一、类的继承:
先来看这个例子:
复制代码 代码如下:

function Person(name,age){
this.name = name;
this.age=age;
this.alertName = function(){
alert(this.name);
}
this.alertAge = function(){
alert(this.age);
}
}
function webDever(name,age,sex){
Person.call(this,name,age);
this.sex=sex;
this.alertSex = function(){
alert(this.sex);
}
}
var test= new webDever("愚人码头",28,"男");
test.alertName();//愚人码头
test.alertAge();//28
test.alertSex();//男

这样 webDever类就继承Person类,Person.call(this,name,age) 的 意思就是使用 Person构造函数(也是函数)在this对象下执行,那么 webDever就有了Person的所有属性和方法,test对象就能够直接调用Person的方法以及属性了; 09年的理解解非常粗浅,呵呵。
作用二、回调函数:
call 和 apply在回调行数中也非常有用,很多时候我们在开发过程中需要对改变回调函数的执行上下文,最常用的比如ajax或者定时什么的,一般情况下,Ajax都是全局的,也就是window对象下的,来看这个例子:
复制代码 代码如下:

function Album(id, title, owner_id) {
this.id = id;
this.name = title;
this.owner_id = owner_id;
};
Album.prototype.get_owner = function (callback) {
var self = this;
$.get('/owners/' + this.owner_id, function (data) {
callback && callback.call(self, data.name);
});
};
var album = new Album(1, '生活', 2);
album.get_owner(function (owner) {
alert('The album' + this.name + ' belongs to ' + owner);
});

这里
复制代码 代码如下:

album.get_owner(function (owner) {
alert('The album' + this.name + ' belongs to ' + owner);
});

中的 this.name就能直接取到album对象中的name属性了。

相关文章

  • js中如何将多层嵌套的数组转换为一层数组

    js中如何将多层嵌套的数组转换为一层数组

    这篇文章主要介绍了js中如何将多层嵌套的数组转换为一层数组问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 用javascript获取textarea中的光标位置

    用javascript获取textarea中的光标位置

    Javascript一向以他的灵活随意而著称,这也使得它的功能可以非常的强大,而由于没有比较好的调试工具,又使得它使用起来困难重重,尤其使对于一些初学者,更是感觉到无从下手。今天探讨的问题是用javascript获取textarea中光标的位置。
    2008-05-05
  • 在Html中使用Requirejs进行模块化开发实例详解

    在Html中使用Requirejs进行模块化开发实例详解

    在前端模块化的时候,不仅仅是js需要进行模块化管理,html有时候也需要模块化管理。这里就介绍下如何通过requirejs,实现html代码的模块化开发
    2016-04-04
  • JS函数(普通函数,箭头函数)中this的指向问题详解

    JS函数(普通函数,箭头函数)中this的指向问题详解

    这篇文章主要给大家介绍了JS中普通函数和箭头函数的this指向,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 用js生成a标签下载文件并携带请求头的两种方法

    用js生成a标签下载文件并携带请求头的两种方法

    这篇文章主要给大家介绍了关于用js生成a标签下载文件并携带请求头的两种方法, 这种下载文件方式在前端项目中非常常见,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • jser必看的破解javascript各种加密的反向思维方法

    jser必看的破解javascript各种加密的反向思维方法

    才发现的破解javascript各种加密的反向思维方法,大家有好的方法都跟帖啊最近发现了一个代码,加密了5层左右,我将破解到最后一步,而且不用javascript解密程序
    2007-04-04
  • JS实现HTML标签转义及反转义

    JS实现HTML标签转义及反转义

    本文主要介绍了JS实现HTML标签转义及反转义的方法。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 详解javascript 正则表达式之分组与前瞻匹配

    详解javascript 正则表达式之分组与前瞻匹配

    本文主要讲解javascript 的正则表达式中的分组匹配与前瞻匹配的,需要对正则的有基本认识,本人一直对两种匹配模棱不清,还有不清楚的朋友跟随脚本之家小编一起看看吧
    2018-05-05
  • 一文带你彻底搞懂JS大文件分片上传的实现

    一文带你彻底搞懂JS大文件分片上传的实现

    这篇文章主要为大家详细介绍了前端JavaScript是如何实现大文件分片上传的,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-05-05
  • 浅谈JavaScript的闭包函数

    浅谈JavaScript的闭包函数

    闭包是有权访问另一个函数作用域中的变量的函数。首先要明白的就是,闭包是函数。由于要求它可以访问另一个函数的作用于中的变量,所以我们往往是在一个函数的内部创建另一个函数,而“另一个函数”就是闭包。本文对其进行系统分析,需要的朋友可以看下
    2016-12-12

最新评论