一些学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. 在线编辑器 (UBB, FCK)

    这里主要说明一下:UBB UBB 使用类型HTML的语法.  UBB相对FCK的HTML方式, 安全性高. 用户不可以直接嵌入HTML代码.   UBB 在线编辑器(JS版): http://www. ...

  2. Struct2、Hibernate3、Spring3框架搭建实战(转)

    采用目前最新的struts-2.3.1.2.hibernate3.6.10.Final.spring-framework-3.1.1.RELEASE开发包,以及eclipse-jee-indigo-S ...

  3. 更改DEVExpress的Column的DisplayFormat为自定义的方法。

    更改DEVExpress的Column的DisplayFormat为自定义的方法. public partial class Form1 : XtraForm { public Form1() { I ...

  4. python 二分法查找

    这个也是之前写的程序,现在把它贴上来 #!/usr/bin/python import os os.system('clear') def binsearch(seq,x,low,high): mid ...

  5. HDU-2604_Queuing

    题目:Problem Description Queues and Priority Queues are data structures which are known to most comput ...

  6. android SDK更新

    在proxy.ini里的[profile]下加上如下配置即可更新android SDK了 dl-ssl.google.com = nofakehttps Oct 26, 2014 #2 2828qw. ...

  7. #!--->hashbang技术

    url中的#! URL 中的 # 本来的用途是跳转到页内锚点.一个 URL 中 # 后的值 (hash tag) 不影响所访问网页的内容,所以搜索引擎在处理仅仅 hash tag 不同的多个 URL ...

  8. LINUX进程控制

    1. 引言 一个程序是存储在文件中的机器指令序列.一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这个机器指令序列载入内存然后让处理器(cpu)逐条执行这些指令. 在Unix术语中 ...

  9. 编程实现LINUX下目录的层层遍历

    /************************************************************************* > File Name: treedir.c ...

  10. iOS开发--单例模式

    单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考 ...