了解javascript中的apply和call

apply和call是javascript中很重要的方法,虽然平时编程很少接触到,但是JS框架中到处在使用这2个方法。

这2个方法是在Function.prototype中,也就是说每个JS函数都有这2个方法。

alert(Function.prototype.hasOwnProperty("apply"));//true
alert(Object.prototype.hasOwnProperty("apply"));//false

这2个函数完成的功能是等价的,唯一的差别在于参数形式不同。

function Person(name,age)
{
    alert("name=" + name +",age="+age);
}

Person.call({},"aty",10);
Person.apply({},["aty",10]);

方法的详细介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function

java中通过反射调用方法的代码如下:

Method method = clazz.getDeclaredMethod("say");
method.invoke(clazz.newInstance(),null);

可以看到:java反射方法调用与apply/call是很相似的。Person相当于method,代表着调用什么方法;{}和clazz.newInstance()相似,代表调用哪个对象(即方法中的this),最后面是方法需要的参数列表。

我们知道在java中this关键字代表当前对象,我们无法修改;javascript中直接调用函数,跟java函数调用一样,this就代表当前对象。

如果想修改this,那么可以使用apply这种方式。

aobj.afunction("1");

aobj.afunction.apply(bobj,["1"]);

第一种方式,函数中的this就是aobj,这是我们比较熟悉的做法;第二种方式,函数中的this是bobj。

通过apply,对象bobj可以使用aobj中定义的方法。

function FunctionA(name)
{
    this.name=name;
}  

function FunctionB(name,age)
{  

    FunctionA.apply(this,arguments);
    this.age=age;
}  

var bObj = new FunctionB("qq",11); 

使用F12调试工具可以发现:bObj对象中有name和age属性。

时间: 2024-10-26 07:06:45

了解javascript中的apply和call的相关文章

JavaScript中的apply()方法和call()方法使用介绍

javascript中apply和call方法的作用及区别说明 call和apply的说明 call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同. 语法:foo.call(this, arg1,arg

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

这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用

JavaScript中的apply和call函数详解

第一次翻译技术文章,见笑了! 翻译原文:Function.apply and Function.call in JavaScript 第一段略. 每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会感到奇怪,一个函数可能会有属于它自己的方法,但是记住,JavaScript中的每个函数都是一个对象.看一下这篇文章,复习一下(refresher)JavaScript特性.你可能还想知道JavaScript中函

javascript 中 call apply 方法的区别

function foo(arg1, arg2, arg3){ alert(art1 + arg2 + arg3); } foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3) call , apply 都属于 Function.prototype的一个方法, 它是JavaScript引擎内在实现的, 因为属于 Function.prototype  所以每个Functi

JavaScript中的apply()、call()、bind()

JavaScript 中 apply.call.bind方法的异同: 相同点 都是用来动态指定函数 this 对象的指向 第一个参数都是 this 要指向的对象,也就是要指定的上下文 都可以利用后续参数传参 不同点 传参形式不同:apply 方法接受的是一个参数数组,call 和 bind 方法接受的是参数列表 执行方式不同:apply.call 会立即执行,而 bind 方法会创建一个新函数,需要单独调用执行 apply() 的使用 语法:func.apply(thisArg, [argsAr

Javascript中的apply与call详解

JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明  call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.  如果

Javascript 中的 apply与call详解

  JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明  call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 

JavaScript中call,apply,bind方法的总结

why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:function(){ console.log(this.user); } } var b = a.fn; b(); //undefined 我们是想打印对象a里面的user却打印出来undefined是怎么回事呢?如果我们直接执行a.fn()是可以的. var a = { user:"追梦子&quo

javascript中的apply与call

1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply([thisObj[,argArray]])