1、定义:

call : 调用一个对象的一个方法,以另一个对象替换当前的对象。

apply : 应用某一对象的一个方法,用另一个对象替换当前的对象。

2、用法:

call:call(thisObj, arg1, arg2, ...);     说明:thisObj 通常表示一个对象,如果没有提供 thisObj 参数,那么 Global 对象将作为 thisObj 。第二个参数开始,如  arg1...可以传递任意形式参数。

apply : apply(thisObj, [argArray]);     说明:thisObj 通常表示一个对象,如果没有提供 thisObj 参数,那么 Global 对象将作为 thisObj。 第二个参数开始,必须是array 或 arguments。

3、区别:

两者区别在于第二个参数。

4、个人理解 :

其实就是把前一对象的方法应用到后一对象上(括号中的第一个参数)。也就是改变了this指针的指向。

5、啥也不说,上几个简单代码 :

             function func1(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
} function func2(name){
this.name= name;
} var obj1 = new func1("func1");
var obj2 = new func2("func2");
obj1.showName();
obj2.showName(); //直接报错,因为obj2里没有 showName() 方法
obj1.showName.call(obj2); //这样就可以把 obj1 中的 showName() 方法给 obj2 用

6、用来实现继承

             function func1(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
} function func2(name){
func1.call(this,name);
} var obj2 = new func2("func2");
obj2.showName();
             var Person = function(name,age){
this.name = name;
this.age = age;
this.gender = ['man','woman'];
} var Stu = function(name,age,high){
Person.call(this,name,age);
this.high = high;
this.showMessage = function(){
console.log('name:'+this.name+", age:"+this.age+", high:"+this.high+", gender:"+this.gender[0]);
}
} new Stu("zhangsan","20","178").showMessage();
             function Person(name,age){
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
}
} function Print(){
this.funcName = "Print";
this.show = function(){
var msg = [];
for(var key in this){
if(typeof(this[key])!="function"){
msg.push([key,":",this[key]].join(""));
}
}
console.log(msg.join(" "));
}
} function Student(name,age,grade,school){
Person.apply(this,arguments);
Print.apply(this,arguments);
this.grade = grade;
this.school = school;
} var p1 = new Person("liang",80);
p1.sayHello();
var s1 = new Student("kobe",20,9,"aaaa");
s1.show();
s1.sayHello();
console.log(s1.funcName);

7,实践

(1)找出数组中最大的元素,

var arr = [5,3,8,1,0];

Math.max(arr);   // 这样是不行的, 会提示 NaN

所以需要遍历,如下:

function getMax(arr){

  var arrlength = arr.length;

var ret = 0;

  for(var i=0; i<arrlength; i++){

    ret = Math.max(ret, arr[i]);

  }

  return ret;

}

console.log(getMax(arr));

换用apply, 可以这样写

function getMaxForApply(arr){

  return Math.max.apply(null, arr);

}console.log(getMaxForApply(arr));

两段代码达到了同样的目的,但是 getMaxForApply 却很优雅、简洁得多。

(2)数组追加

var arr1 = [1,2,3];

var arr2 = [4,5,6];

把 arr2 追加到 arr1 中。

arr1.concat( arr2 ); // concat 方法并不改变 arr1 本身

正常需要如下操作:

function addarr(arr1,arr2){

  var arrlen = arr2.length;

  for(var i=0; i<arrlen; i++){

    arr1.push(arr2[i]);

  }

}

使用Apply ,代码就变得很简洁

function addarr(arr1,arr2){

  Array.prototype.push.apply(arr1,arr2);

return arr1;

}

关于call 与 apply 那些事的更多相关文章

  1. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  2. js中call、apply、bind那些事2

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  3. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  4. call,apply,bind的用法

    关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成 ...

  5. js中bind,call,apply方法的应用

    最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = &quo ...

  6. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  7. 关于javascript中apply()和call()方法的区别

    如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...

  8. 关于angularjS与jQuery框架的那些事

    这篇文章主要介绍了jQuery和angularJS的区别浅析,本文着重讲解一个熟悉jQuery的程序员如何应对angularJS中的一些编程思想的转变吗,需要的朋友可以参考下 最近一直研究angula ...

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

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

随机推荐

  1. Centos6快速yum lamp

    yum install httpd httpd-devel mysql mysql-server mysql-devel  php php-mysql php-common php-gd php-mb ...

  2. Google的一些功能和软件

    本博文的主要内容有 .Google的一些功能和软件 Google的一些功能和软件 1.  iGoogle 2.  Google Earth 3.  Google Talk http://www.goo ...

  3. C#中HashTable的用法示例2

    命名空间 System.Collections 名称 哈希表(Hashtable) 描述 用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用 ...

  4. springmvc报错 org.springframework.web.servlet.DispatcherServlet

    在写springMVC时,导入所有需要的包后,运行程序,控制台报以下错误: 严重: Servlet [springDispatcherServlet] in web application [/Spr ...

  5. Maven浅析-1

    Maven的配置 1.首先从http://maven.apache.org/download.cgi下载当前最新版本的maven. 如果不想自己安装maven的话,建议直接下binary zip文件, ...

  6. jquery中字符串类型转换成整形的方法

    jQuery有一个自带的函数为parseInt():这个函数可以把字符型的数字转换成整形例如: parseInt("1234"); //返回1234 parseInt(" ...

  7. jQuery自定义多选下拉框

    项目中需要自定义一个下拉框多选插件,业务问题还是自己实现比较好 通过$.fn 向jQuery添加新的方法 下拉数据通过参数传递进去,通过调用该插件时接收,选择后的确定与取消事件采用事件传递方式 代码如 ...

  8. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  9. zoj 3657 策略题 easy

    http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4880 由于是要去牡丹江.是浙大出题,所以找了份浙大的题,第一道水题做的就不顺 ...

  10. MySQL 错误日志(Error Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件.通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等. 这些日志能够帮助我们定位mysqld ...