每个函数都包含两个非继承而来的方法:call和apply.

我们可以通过这两个方法来间接调用函数。可以这样:

f.call(o);
f.apply(o);
//o对象间接调用了f函数

这与下面的功能相似:

o.m = f;
o.m();
delete o.m//删除临时方法

语法:

fn.call(obj,arg1,arg2,arg3...)              fn.apply(obj,[arry]/arguments)      [apply中第二个参数可以使纯数组也可以是类数组]

在es5严格模式下,第一个参数都会变成this值;而在es3和非严格模式下,undefined和null被全局对象所代替,其他原始值则会被相应的包装的对象所替代。

“call和apply最强大的地方是能够扩充函数赖以运行的作用域”,很多博客文章中都是这样描述的,其实这种说法是错误的,绝对是错误的!所以我不用“误区”这个词语了。因为JS是静态词法作用域,是按照语法定义来确定作用域,它的作用域其实是无法扩充的,而this 是 context,可以改变 ,call和apply改变的是this,改变的是上下文!

下面是一个例子:

var name = "复读机",
age = ;
function say(){
console.log("name : " + this.name);
console.log("age : " + this.age);
}
var obj = {
name : "bb机",
age :
}
say(); //name : 复读机 age : 25
say.call(obj);//name : bb机 age : 30

如果我们不使用call方法,我们是怎么用obj调用say这个函数的呢

var name = "复读机",
age = ;
function say(){
console.log("name : " + this.name);
console.log("age : " + this.age);
}
var obj = {
name : "bb机",
age :
}
say(); //name : 复读机 age : 25
obj.say = say;
obj.say();//name : bb机 age : 30

可以看出用call将会更方便!

或许我们使用过require框架中的require函数,觉得非常神奇!它可以将一个数组依次传入一个回调函数的参数中,其实它的模型非常简单!

下面是例子:

var noop = function(){};
function require(list,fn){
fn.apply(noop,list);
}
require([,,],function(a,b,c){
console.log(a);
console.log(b);
console.log(c);
})

今天到此为止哈。。

javascript call和apply的更多相关文章

  1. javascript call与apply关键字的作用

    apply接受两个参数.第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合. call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数. 1 2 3 4 ...

  2. 《JavaScript总结》apply、call和bind方法

    在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...

  3. javascript中call,apply,bind的用法对比分析

    这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们.   关于call,apply,bind这三个函数的用法,是学习java ...

  4. JavaScript中的apply,call与this的纠缠

    1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...

  5. Javascript中的apply与call详解

    JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.arg ...

  6. JavaScript方法call,apply,caller,callee,bind的使用详解及区别

    一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即  “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...

  7. JavaScript中的apply和call函数详解(转)

    每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会感到奇怪,一个函数可能会有属于它自己的方法,但是记住,J ...

  8. javascript篇-----函数apply()和call()

    转自:http://www.jb51.net/article/28013.htm 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的 ...

  9. JavaScript基础插曲---apply,call和URL编码等方法

    Js基础学习 Js的压缩: 就是利用js的语法格式通过缩短变量名,去掉空格等来进行压缩. Apply和call的使用 1:apply方法:应用某一对象的方法,用于一个对象替换当前对象.主要是改变thi ...

  10. JavaScript中call,apply和prototype

    [TOC] call()方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 如果没有提供 thi ...

随机推荐

  1. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  2. JTextField限制输入长度的完美解决方案(转)

    关于JTextField限制输入字符长度的问题,因为没提供现成的api,所以我们得自己动手,来实现这个功能,网上也有很多这样的资料,大多是在JTextField的Document的insertStri ...

  3. UVA1232 - SKYLINE(段树部分的变化)

    UVA1232 - SKYLINE(线段树区间改动) 题目链接 题目大意:依照顺序盖楼.假设这个位置(当前要盖的楼覆盖范围内)要新建的楼的高度>=之前就有的最大高度,那么就+1.最后输出这个+1 ...

  4. Linux命令行下载文件百度云盘

    本来想直接使用wget去下载.但百度似乎增加限制,下半停产,不就不再下.刚刚好找其他方法.另辟蹊径: http://oott123.github.io/bpcs_uploader/ 版权声明:本文博客 ...

  5. CentOS6.5查看一port执行状态

    netstat -nap | grep 22 版权声明:本文博主原创文章,博客,未经同意不得转载.

  6. HTTPS背后的加密算法(转)

    当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一 ...

  7. ArcGIS JavaScript API本地部署离线开发环境[转]

    原文地址:http://www.cnblogs.com/brawei/archive/2012/12/28/2837660.html 1 获取ArcGIS JavaScript API API的下载地 ...

  8. 大数据系列修炼-Scala课程05

    Scala多重继承.构造器的执行顺序.AOP实现 多重继承的trait实现:Scala中接口可以继承具体的类,trait接口可以实现多重继承,并且某个类也可以继承特定的类,在继承后面可以混入,接口的实 ...

  9. div元素上下左右居中

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. IOS新手教程(二)-控制流

    int main(){ //2.控制流 //2.1 if语句 //1. if(expression){ } //2. if(expression){ }else{ } //3.能够有0个或是多个els ...