一些学js的同学一看到call, apply, 就蒙了, 感觉不好懂, 看的头大. 今天我们就一起来研究一下这2个东东.
彻底弄清楚它们的用法.

定义:

call, apply是函数的方法, 只有函数才有这2个方法.

作用:

call, apply主要作用是改变函数赖以执行的作用域, 简言之就是改变函数中this的指向.

用法:

fn.call(obj, args1, args2, ...); //obj是指定函数赖以执行的对象, arg1等是传给函数的参数(假如有的话)
fn.apply(obj, [args1, args2, ...]); //obj是指定函数赖以执行的对象, [arg1, ...]等是传给函数的参数数组(假如有的话)

差别:

call和apply的差别就是参数的不同.
call中的参数必须是一个个枚举出来的.
apply中的参数必须是数组或者是arguments对象

例子1:
function fn(arg){
alert(arg);
}
fn.call(this, 'hello world'); //hello world, 由于fn中没指定this, 所以此时的this指向window对象.
fn.apply(this, ['hello world']); //hello world, 由于fn中没指定this, 所以此时的this指向window对象. 例子2:
function fn(arg1, arg2, arg3){
alert(arg1 + arg2 + arg3);
}
fn.call(this, 'hello world', 'petty', 'jack'); //hello worldpettyjack
fn.apply(this, ['hello world', 'petty', 'jack']); //hello worldpettyjack 例子3:
function myFn(arg1, arg2, arg3){
alert(arg1 + arg2 + arg3);
}
function fn(arg1, arg2, arg3){
myFn.apply(this, arguments); //此处传arguments对象, 即fn中的[arg1, arg2, arg3]
}
fn('hello', 'world', '!'); //helloworld! 例子4:
var o = {
name: 'tom'
};
function fn(){
alert(this.name);
}
fn.call(this); //此时this指向window, 所以是window的name值
fn.call(o); //此时this指向o, 所以是o的name值, 'tom'
fn.apply(o); //同上 例子5:
function MyFn(name){
this.name = name;
} // 定义一个构造函数 function Fn(age, name){
this.age = age;
MyFn.call(this, name); // 理解了call的定义后, 就不难看出, 此处继承了MyFn的name属性.
//MyFn.apply(this, [name]); // 也可
} // 定义另一个构造函数 var person = new Fn(20, 'tom');
alert(person.name); // 原本Fn是没有name属性的, 但是使用了call或者apply后, 就继承了MyFn的name属性, 所以为'tom' 理解了以上的call和apply的原理后, 我们一起来模仿jquery中each函数. function each(obj, fn){
var i;
if(Object.prototype.toString.call(obj) === '[object Array]'){
for(i = 0, length = obj.length; i < length; i++){
fn.call(obj[i], i, obj[i]);
}
}
else if(typeof obj === 'object'){
for(i in obj){
if(obj.hasOwnProperty(i)){
fn.call(obj[i], i, obj[i]);
}
}
}
else{
return false;
}
} var oDiv = document.getElementsByTagName('div');
each(oDiv, function(){
this.style.background = '#ff0000'; // 所有div的背景都变为红色的了.
});

简单吧.好了, 讲解到此为止.

详解javascript中的call, apply的更多相关文章

  1. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  2. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  3. 详解 javascript中offsetleft属性的用法(转)

    详解 javascript中offsetleft属性的用法 转载  2015-11-11   投稿:mrr    我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...

  4. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  5. 详解JavaScript中的原型

    前言 原型.原型链应该是被大多数前端er说烂的词,但是应该还有很多人不能完整的解释这两个内容,当然也包括我自己. 最早一篇原型链文章写于2019年07月,那个时候也是费了老大劲才理解到了七八成,到现在 ...

  6. 【转】详解JavaScript中的异常处理方法

    有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个 ...

  7. 详解JavaScript中的Event Loop(事件循环)机制

    前言 我们都知道,javascript从诞生之日起就是一门单线程的非阻塞的脚本语言.这是由其最初的用途来决定的:与浏览器交互. 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程 ...

  8. 详解JavaScript中的arc的方法

    今天说说JavaScript在网页中画圆的函数arc! 一.arc所需要的参数设置 1 arc(x, y, radius, startAngle, endAngle, counterclockwise ...

  9. 详解JavaScript中的this

    JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一. 个人也觉得js中的this不是一个好的设计,由于this晚绑定的特性,它可以是全局对象,当前对象,或者…有人甚至因为坑大而不 ...

随机推荐

  1. phonegap/cordova常用命令

    创建项目 cordova create foldername com.wps.test projectName cd foldername 基本设备信息 设备 API: cordova plugin ...

  2. 两种高性能I/O设计模式(Reactor/Proactor)的比较

    原文出处: Alex Libman   译文出处:潘孙友   欢迎分享原创到伯乐头条 综述 这篇文章探讨并比较两种用于TCP服务器的高性能设计模式. 除了介绍现有的解决方案,还提出了一种更具伸缩性,只 ...

  3. 如何在Asp.net中备份Access数据库?

    public   void   Create(   string   mdbPath   ) { if(   File.Exists(mdbPath)   )   //检查数据库是否已存在 { thr ...

  4. ExtJS与jQuery的一点细节上的对比

    首先说明这不是一篇完整解读ExtJS和jQuery所有方面差异的文章,只是针对我个人刚看了两天的jQuery产生的一些疑问的整理.之前用过一段时间ExtJS,了解ExtJS的一些机制.现在做移动开发, ...

  5. 客户端的数据来源:QueryString, Form, Cookie Request[]与Request.Params[]

    在ASP.NET编程中,有三个比较常见的来自于客户端的数据来源:QueryString, Form, Cookie . 我们可以在HttpRequest中访问这三大对象. QueryString: 获 ...

  6. ZOJ3718 Diablo II(状态压缩dp)

    题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...

  7. POJ 2021 Relative Relatives(map+树的遍历)

    题意: 今天是Ted的100岁生日.凑巧的是,他家族里面每个人都跟他同一天生日,但是年份不同. 现在只给出一些 父亲的名字,孩子的名字,以及孩子出生时父亲的年龄, 要求将Ted以外的家族成员按年龄降序 ...

  8. CentOS 6.5下安装Zabbix 2.2.x

    操作系统:CentOS Mini 6.5 yum install httpd.x86_64 httpd-manual.x86_64 php-xml  php-mbstring mysql-server ...

  9. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心

    D. Lazy Student   Student Vladislav came to his programming exam completely unprepared as usual. He ...

  10. OSX Mavericks下使用Synergy进行多台主机通过wifi共享键鼠问题的解决方法

    转帖: OSX 10.9 几天用下来还是遇到几处问题的:之前先是遇到了OSX Mavericks GM598无法从Appstore升级到完全正式版的问题,下载无反应,后来找到了解决方法,发在以下链接: ...