一些学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. nsight 初级使用指南

    1.安装,没有什么特殊设置 2.打开vs,编译生成你需要分析的.exe,在vs上方菜单,有nsight menu, choose Start Graphics Debugging. 3.在弹出对话框中 ...

  2. Oracle 时间处理(加减)

    一. 类似SQL SERVER中DateAdd select sysdate,add_months(sysdate,12) from dual;        --加1年 select sysdate ...

  3. 也可以使用如下命令更改您的默认 Shell

    也可以使用如下命令更改您的默认 Shell chsh -s /bin/zsh (需要输入您的密码)

  4. HDU1435,好开心,稳定婚姻

    费了三天,终于解决了各种BUG,PASS,好开心,这才是ACM真正的快乐,就在AC的那刻, 网上基本没甚程序,开始被各种变量名搞晕,无语!!! 有几个题目没说的东西:认为序号是1-N, 然后先排序,弄 ...

  5. Sqli-labs less 25

    Less-25 本关主要为or and过滤,如何绕过or和and过滤.一般性提供以下几种思路: 大小写变形 Or,OR,oR 编码,hex,urlencode 添加注释/*or*/ 利用符号 and= ...

  6. 同一网站不同和二级域名和不同子目录的cookie

    1.cookie二级域名的实现: 用户其中一个站点登录,而且可以各个子频道间切换,保持登录状态设置Cookie时,使用如下代码即可:setcookie(name,value,expire,path,& ...

  7. 数据库中已存在名为 'View_Business' 的对象。

    用EF框架+MCF,编译的时候出现:数据库中已存在名为 'View_Business' 的对象. 解决方案: 1.Enable-Migrations2.Add-Migration3.Update-Da ...

  8. 初学Ajax(三)

    $.ajax() $.ajax()是所有ajax方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装.这个方法只有一个参数,传递一个各个功能键值对的对象. $.ajax()方法对象参数表 ...

  9. 模拟+思维 HDOJ 5319 Painter

    题目传送门 /* 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最 ...

  10. Spark源码分析环境搭建

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3868718.html 本文主要分享一下如何构建Spark源码分析环境.以前主要使用eclipse来阅读源 ...