js里function的apply vs. bind vs. call
js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply、bind、call,都在function的原型里。这3种方法的异同在stackoverflow的这个答案里说的最清楚,下面只是自己的理解。
1. 异同
这3种方式的相同点是:改变了func调用的上下文,链接到新的对象上。这使得任何函数都可以被其他对象调用,即使这个对象没有定义该函数。
区别是:调用的方式不同。
- call: 最简单,立即调用,按顺序传参
- apply:立即调用,按数组传参
- bind: 延迟调用(返回一个新的func),按顺序传参
2. 例子
上代码:
var person = {
name: "Alex",
code: function(lang1, lang2, lang3, lang4){
//在这里断点,观察arguments和lang1-4的区别
console.log(this.name + " code in " + arguments.toString());
}
};
var machine = {
name: "alphago"
};
//普通的调用方式
person.code("C#");
//call是按顺序传参
person.code.call(machine, "python", "perl");
//apply是按数组传参,如果不能转成数组,抛TypeError
person.code.apply(machine, ["C", "C++", "lisp"]);
//Uncaught TypeError: CreateListFromArrayLike called on non-object
//person.code.apply(machine, "C", "C++", "lisp");
//不报错,但转出的数组为空
//person.code.apply(machine, {lang1:"C", lang2:"C++", lang3:"lisp"});
var func = person.code.bind(machine);
func("python", "perl");
//按顺序传参,类似call
//func(["C", "C++", "lisp"]);
var func1 = person.code.bind(machine, "python", "perl");
func1("C#");
3. 使用场景
- 如果是可变数量的参数,那么很明显只能使用apply;
- 如果要延迟调用某个函数,那么只能使用bind;
- bind能够实现所谓的柯里化(function currying),即先传一部分参数进去,使用的时候再传另一部分参数,这种场景下也只能使用bind。
js里function的apply vs. bind vs. call的更多相关文章
- JS里面的call, apply以及bind
参考了这篇文章:http://www.tuicool.com/articles/EVF3Eb 给几个例子 function add(a,b) { alert(a+b); } function sub( ...
- 原生JS:Function对象(apply、call、bind)详解
Function对象(apply.call.bind) 原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5850180.html 本文参考MDN做的 ...
- JS中call、apply、bind使用指南,带部分原理。
为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply、bind那些事2
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply和bind到底有什么区别?
介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...
- js中call、apply、bind到底有什么区别?bind返回的方法还能修改this指向吗?
壹 ❀ 引 同事最近在看angularjs源码,被源码中各种bind,apply弄的晕头转向:于是他问我,你知道apply,call与bind的区别吗?我说apply与call是函数应用,指定thi ...
- JS中call()和apply()以及bind()的区别
一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...
- js中call,apply和bind
1,首先先做一个定义:每个函数都包含两个非继承的方法:apply()和call(),apply和call这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值,两者唯一的 ...
随机推荐
- Objective-C语言分类与协议
分类(Category)允许向一个类文件中添加新的方法声明,它不需要使用子类机制,并且在类实现的文件中的同一个名字下定义这些方法.其语法举例如下: #import "ClassName.h& ...
- Extract Stylish styles and save as JSON format
Introduction Stylish is a easy browser extension/plugin for users to customizing the web page stylin ...
- Python之logging模块
一.引言 之前在写一些小程序的时候想把日志内容打到文件中,所以就自己写了一个logger.py的程序,如下: #!/usr/bin/python # -*- coding=utf-8 -*- impo ...
- Android ListView实现不同item的方法和原理分析
ListView实现不同item的方法和原理分析 一问题抛出Listview是android里面的重要组件,用来显示一个竖向列表,这个没有什么问题:但是有个时候列表里面的item不是一样的,如下图,列 ...
- tomcat域名访问配置
模拟线上环境,在本地以域名访问系统思路 1.首先在hosts文件将域名映射为本地IP 2.假如服务器80端口已被占用,可以用nginx转发,在nginx/vhosts/abc.com加入如下配置 se ...
- AS3语言注意事项汇总
1. 在IE中,主DisplayObject加入stage后,可能其大小还是0,这时可以通过监听resize信息,在主DisplayObject获得正确的大小后,运行主要程序.需要注意的是在这个过程中 ...
- 转义字符_MySQL识别下面的转义序列
转义字符.MySQL识别下面的转义序列 在字符串中,某些序列具有特殊含义.这些序列均用反斜线('\')开始,即所谓的转义字符.MySQL识别下面的转义序列: \0 ASCII 0(NUL)字符. \' ...
- Android中插件开发篇之----应用换肤原理解析
一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...
- HierarchyViewer for iOS 2.0 BETA Introduction
We know HierarchyViewer is an useful tool in Android SDK. The developer and tester, who haven't the ...
- rmi远程调用
1.在服务器端程序中的spring-servlet.xml中添加 <bean id="userService" class="org.springframework ...