apply,call,bind

在javascript里面,apply和call都是为了改变函数运行时的上下文(context)产生的,说白了,就是改变函数中this的指向。

javascript有个特点【定义上下文】和【运行上下文】以及【上下文是可以改变的】这个概念。

call和apply二者,作用基本完全一样,只是接受参数的方式不一样。

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])

其中this是你想指定的上下文,他可以是任何一个javascript对象(javascript中一切皆对象),call需要按照顺序传递参数进去,

apply是把参数放在一个数组里面。

javascript中某些函数参数数量是不确定的,所以只能在参数明确知道时才能用call,否则用apply,然后把参数push进数组传进去,当参数不确定时

函数内部也可以使用arguments这个数组遍历所有参数。

具体来说:

1,数组之间的追加

1 var array1 = [12 , "foo" , {name "Joe"} , -2458];
2 var array2 = ["Doe" , 555 , 100];
3 Array.prototype.push.apply(array1, array2);
4 /* array1 值为  [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */

2,获取数组中的最大值和最小值

1 var  numbers = [5, 458 , 120 , -215 ];
2 var maxInNumbers = Math.max.apply(Math, numbers),   //458
3     maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458

number本身没有max方法,但是math有,我们就可以借助 call 或者 apply 使用其方法。

3、验证是否是数组(前提是toString()方法没有被重写过)

1 functionisArray(obj){
2     returnObject.prototype.toString.call(obj) === ‘[object Array]‘ ;
3 }

4、类(伪)数组使用数组方法

1 var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

Javascript中存在一种名为伪数组的对象结构。比较特别的是 arguments 对象,还有像调用 getElementsByTagName , document.childNodes 之类的,它们返回NodeList对象都属于伪数组。不能应用 Array下的 push , pop 等方法。

  但是我们能通过 Array.prototype.slice.call 转换为真正的数组的带有 length 属性的对象,这样 domNodes 就可以应用 Array 下的所有方法了。

bind也可以改变函数内部this指向,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。

时间: 2024-10-12 13:53:41

apply,call,bind的相关文章

javascript中apply、call和bind的区别,容量理解,值得转!

a)  javascript中apply.call和bind的区别:http://www.cnblogs.com/cosiray/p/4512969.html b)  深入浅出 妙用Javascript中apply.call.bind   http://www.admin10000.com/document/6711.html ====================================================== 在JS中,这三者都是用来改变函数的this对象的指向的,他们

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

最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = "obj";}Obj.prototype = { show : function (){ etTimeout(function (){ console.log(this.type); },300) } var obj = new Obj();obj.show();  //undefined 所幸伟

来挑战下你的js基本功,原来以前认为的基础扎实都是空中楼阁。由Array.from引申的知识点。包括数组排序,call,apply,bind。等等。

以前看过一句话基础的不一定简单,一直没体会到,今天终于见识到了.反思了下自己之前的工作学习,一句话总结,很浮躁.不多说,来个小的例子挑战下.Array.from().对你没看错,就是这个简单的api,用来将有length属性的数据结构转换为数组,在转换之前可以使用map对每一个生成的值做处理.看到这里你可能一略而过,很简单吗?不就是转换吗?那么接下来我来引申几个问题.问题1:Array.from()的这个api兼容性如何?你会看到ie不兼容.如果你想用怎么办?看看polyfill实现吧.然后po

apply,call,bind,symbol的用法

一.apply 在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域. this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向. 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组. 用法举例 Math.max.apply(null, array) Math.max(...array) 二.call 在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域. this总

学习之apply,call,bind实现

目录 apply call bind demo apply 简单说:创建一个新方法,用eval执行,完了之后删除掉,最后返回执行的结果. Function.prototype.applyCopy = function(context) { context.fn = this;// 谁调用 this就是谁 var args = arguments[1]; if(!args || args.length == 0) return context.fn(); var result = eval('co

你知道多少this,new,bind,call,apply?那我告诉你

那么什么是this,new,bind,call,apply呢?这些你都用过吗?掌握这些内容都是基础中的基础了.如果你不了解,那还不赶快去复习复习,上网查阅资料啥的! 通过call,apply,bind可以改变this的指向,this指向一般指向它的调用者,默认挂载在window对象下.es6中的箭头函数中,this指向创建者,并非调用者. const func = function () { console.log(this); const func2 = function () { conso

js中三个默认方法call,applay,bind

这三个都是函数自带的方法(Function.prototype),这三个方法都能够改变函数内部 this的指向, call //call方法接收三个参数,第一个是this指向,第二个,三个是传递给函数的实参,可以是数字,字符串,数组等类型的数据类型都可以 function fn(n1,n2){ console.log(this); console.log(n1,n2) } fn.call();//=>this:window; let obj = {fn:fn}; fn.call(obj);//=

DNS服务解析,如何用bind构建主从架构的DNS服务器。

DNS(Domain Name System,域名系统) 在互联网上实现FQDN与IP地址的解析,这样避免了人们在访问站点时,记忆长串难懂的ip地址,只需要记忆人们容易理解的域名就行了. FQDN (Fully Qualified Domain Name,完全合格域名) FQDN------------------IP Address 正向解析 IP Address------------FQND 反向解析 简述工作原理: 我们大家都知道,全球一共有13台根节点服务器,当我们的DNS服务器收到一

js 数组,字符串,JSON,bind, Name

/** * Created by W.J.Chang on 2014/5/23. */ // 判读是否是数组的方法 console.log(Array.isArray(new Array)); console.log(Array.isArray([])); var arr = [1,2,3]; // 遍历方法 arr.forEach(function (v){ console.log(v); }); console.log("---------------------"); // 过滤