上节介绍了call()和apply()的用法,这节再讨论一下arguments参数和bind函数的用法以及函数柯里化就算是完结了。

    bind()函数

先看定义:

bind()方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。代码如下:

 var name="window";
var obj={
name:"obj对象"
}; function sayName(){ console.log(this.name)
}; var bindSayName = sayName.bind(obj); bindSayName(); //obj对象

由代码可以看出,call()函数会直接调用,而bind()函数则是先生成,再通过其他途径来调用,但是this指针不会再发生改变。

    arguments

函数体内可以通过arguments对象来访问参数数组,从而获得传递给函数的每一个参数。

 function fn (x,y,z) {
arguments.length; //
arguments[0]; //
arguments[0]=10;
console.log(x); // arguments[2]=100;
console.log(z) //undefined arguments.callee ===fn //true
} fn(1,2);

使用arguments来获得函数参数时,arguments需要和参数之间存在绑定关系,如4,5行是可以修改成功的,但7,8行是没有绑定关系的,因为并没有一开始传递z这个参数进来。(4,5行在严格模式下参数也是不会变化的)

arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定。

    函数currying化

即把函数拆分成多个单元。比如:

 function add(a,b,c) {
return a+b+c;
} var fun1 = add.bind(undefined,100);
fun1(1,2); // var fun2 = fun1.bind(undefined,200);
fun2(10); //

5,6行表示给add函数绑定了一个undefined(相当于window),并传递了一个参数100,则100会首先赋值给add函数的参数a,然后执行fun1,b和c分别赋值为1,2,得到103。8,9行再在fun1的基础上绑定参数200,这时200会传递给参数b,因为a已经绑定为100,然后传入c=10,得到310。

    柯里化的好处

 function getConfig (colors,size,other) {
console.log(colors,size,other);
} var defaultConfig = getConfig.bind(undefined,"#000","1024*768"); defaultConfig("嘿嘿"); //#000 1024*768 嘿嘿
defaultConfig("呵呵"); //#000 1024*768 呵呵

可以看出来,第五行可以只传入两个参数,第七行和第八行分别再传入other参数,colors和size参数则是公共的,这样可以大量减小代码冗余。

    bind和new

 function fn () {
this.a=100;
return this.b;
} var fun1 = fn.bind({b:1}); fun1(); //
new fun1() //{a:100}

return后必须是个对象才会作为返回值,否则会返回this的值,this会指向无bind时的this指向,并返回所有的值。

    bind方法的实现

 if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeOf this!=='function') {
throw new Error('调用bind函数的对象不是function。')
};
//函数实现
var aArgs= Array.prototype.slice.call(arguments,1),
fToBind=this,
fNOP = function(){},
fBound = function () {
return fToBind.apply(this instance fNOP?this:oThis,
aArgs.concat(Array.prototype.slice.call(arguments)))
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
};

bind方法的实现还是比较绕的,等研究完原型链有关的内容再回头做这段代码的介绍。

javascript-this,call,apply,bind简述3的更多相关文章

  1. javascript-this,call,apply,bind简述2

    上节我们一起研究了this这个小兄弟,得出一个结论,this指向调用this所在函数(或作用域)的那个对象或作用域.不太理解的朋友可以看看上节的内容,这次我们主要探讨一下call(),apply(), ...

  2. javascript-this,call,apply,bind简述1

    最近在系统的学习面向对象方面的知识,遇到的最大拦路虎就数this的指向,call,apply,bind函数的使用,单独抽出一天时间把这几个烦人的家伙搞定,去学习更深入的内容. 首先介绍一下this的一 ...

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

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

  4. JavaScript中call,apply,bind方法的总结。

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

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

    原文链接:http://www.cnblogs.com/pssp/p/5215621.html why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之 ...

  6. JavaScript中call,apply,bind方法的区别

    call,apply,bind方法一般用来指定this的环境. var a = { user:"hahaha", fn:function(){ console.log(this.u ...

  7. JavaScript中call,apply,bind方法

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  8. JavaScript 之 call apply bind

    关键字 this 绑定的方法 this的动态切换,固然为JavaScript创造了巨大的灵活性,但也使得编程变得困难和模糊.有时,需要把this固定下来,避免出现意想不到的情况.JavaScript提 ...

  9. javascript中call,apply,bind的使用

    不同点: 1.call():传参方式跟bind一样(都是以逗号隔开的传参方式),但是跟apply(以数组的形式传参)不一样, 2.bind(): 此方法应用后的情形跟call和apply不一样.该方法 ...

随机推荐

  1. 使用word和pdf进行仿书编辑的经验

    一.问题的提出:    一本书扫描好,要将书中的图片转换为文字版的word文档.二.问题的分析:    1.文字的提取    2.文字的编排三.问题的解决    1.如果用的是Adobe Acroba ...

  2. 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  3. ActivityGroup里面装的子Activity不执行OnActivityResult()的解决办法

    转自http://blog.csdn.net/snakewarhead/article/details/7976831 tab activity 中调用startActivityForResult 以 ...

  4. ios auto layout demystified (二)

    Constraints Constraint Types Layout constraints (NSLayoutConstraint class, public)—这些规则指定了view的几何学.他 ...

  5. Registering iOS Devices for Testing - 注册测试设备

    http://support.smartbear.com/viewarticle/63764/ Applications developed using the iOS Developer Progr ...

  6. 30个实用的 Photoshop 动作《免费下载》

    这篇文章向设计师们分享30个实用的 Photoshop 动作下载.Photoshop 的动作是用集合了许多步的操作的集合,使执行任务自动化,这为设计者在进行图像处理的操作上带来很多方便.同时用户还可以 ...

  7. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  8. nodejs morgan包

    新建app.js var express = require('express') var logger = require('morgan') var app = express() app.use ...

  9. [python]爬代理ip v2.0(未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

  10. hive的内部表与外部表创建

    最近才接触Hive.学到了一些东西,就先记下来,免得以后忘了. 1.创建表的语句:Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_na ...