箭头函数不能用做构造函数

箭头函数没有arguments参数

箭头函数没有自己的this,是从作用域链上取this,是与箭头函数定义的位置有关的,与执行时谁调用无关,所以用call,apply,bind去调用箭头函数时,第一个参数会被忽略。非箭头函数是在函数调用时,在当前执行上下文里动态的取this。

  

Function.prototype的bind, apply,call方法:

apply,call和bind都为改变this的指向,利用这一点可以用它们来实现继承

function objFun() {
this.age = 18;
console.log(this)
}; const obj = {name:'example'};
const bindFun= objFun.bind(obj);
bindFun();//{age:18, name: 'examle'}

 apply用于不知道参数具体个数的情况下,参数的个数是固定值时,用call.

bind有别于以上两者的是,它不会立即的执行,它只是一个绑定,即提前为该函数指定this指向和预设参数。

用bind来实现偏函数, 在 bind时可以预设初始参数。在后继调用时,会将预设参数加到参数列表前面,再执行目的函数。

function objFun(name, age, address) {
this.name = name;
this.age = age;
this.address = address; console.log(this)
}; const obj = {name:'example'};
const bindFun= objFun.bind(obj, obj.name);
bindFun(18, 'China'); // 第一个参数name被预设为example,而且不可改变。即后继执行多少次bindFun,name值都为exapmle

bind可以配合setTimeout使用,可以使this指向类实例。 使用window.setTimeout时会将this指向window。当需要this指向实例对象时,需要将this做为bind的参数来用于setTimeout内的回调函数上。

function F() {

  this.name = 'example';

}

F.prototype.show = function() {

  setTimeout( console.log.bind(console, this.name), 1000);
  或者 setTimeout( Function.prototype.bind.call(console.log, console, this.name), 1000);
} const f = new F(); f.show();

  

setTimeout的第一个参数为回调函数,即函数的声名。如果不是函数,而是一行代码的话,比如 console.log(1), 会报和eval()一样的安全风险.

bind还可用于apply和call方法,来实现快捷调用

Array.prototype.slice.apply([1,2,3])  <=> const slice = Function.prototype.apply.bind(Array.prototype.slice); slice([1,2,3]) // slice的参数不固定,所有bind apply方法

const map = Function.prototype.call.bind(Array.prototype.map, [1,2,3]); //数据的map方法就两个参数,所以此处bind call方法

map(i => console.log(i))
map(i=> i * 2)
map(i => `我是${i}`)

  

Function.protoType.call.bind/ Function.protoType.bind.call/Function.protoType.apply.call/Function.protoType.apply.bind以及ES6的Reflect.apply

1 Function.protoType.call.bind

  绑定call这个函数

var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice); function list() {
return slice(arguments);
} var list1 = list(1, 2, 3); // [1, 2, 3]

  

2 Function.protoType.bind.call

  立即执行bind函数

setTimeout( Function.prototype.bind.call(console.log, console, this.name), 1000);

  

3  Function.protoType.apply.call

  立即执行apply函数

Function.prototype.apply.call(console.log, console, [1,2,3])

  

4 Function.protoType.apply.bind

var log = Function.prototype.apply.bind(console.log, console);
log([1 ,2 ,3])  // 1 2 3

5 Reflect.apply

等价于Function.prototype.apply.call

Reflect.apply(console.log, console, [1, 2, 3]) // 1 2 3

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

http://www.ituring.com.cn/article/128553

箭头函数表达式和声名式函数表达式的区别以及 Function.prototype的bind, apply,call方法的更多相关文章

  1. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  2. MVC 的 Razor引擎显示代码表达式与隐式代码表达式

    隐式代码表达式 就是一个标识符,之后可以跟任意数量的方法调用("()").索引表达式("[]")及成员访问表达式(".").但是,除了在&q ...

  3. 2018.11.06 生成器函数进阶&列表推导式&生成器表达式

    1.生成器函数进阶 2.列表推导式 3.生成器表达式

  4. 关于gcc内置函数和c隐式函数声明的认识以及一些推测

    最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候,你在代码里面引用了一个函数但是没有包含相关的头文件,这个 ...

  5. python基础-三元表达式/列表推导式/生成器表达式

    1.三元表达式:如果成立返回if前的内容,如果不成立返回else的内容 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' ...

  6. Python-02 生成器表达式,列表推导式

    列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for  变量i  in 可迭代的数据类型 ] 列表 ...

  7. day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)

    一,复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascll进行比较 # print('a' > 'A') #True # print('ac' > 'ab' ...

  8. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  9. python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

随机推荐

  1. 小飞音箱wifi配网流程

    音箱出货时,已经内置wifi,如果无法接通,按照如下方案执行: 小飞音箱wifi配网流程 0. 接通音箱电源 通电3分钟后,音箱如果显示红色光圈,表示未联网,则需要手动联网 1. 手机下载小飞在线ap ...

  2. 在虚拟机Ubuntu14.04中设置静态ip后无法上网的问题的解决

    背景:用着实验室代理服务器上网. 原因:网关和DNS没有设置正确 网关和DNS参照 真机cmd在命令窗口使用ipconfig  /all命令查看   虚拟机: sudo gedit /etc/netw ...

  3. JavaScript文件与HTML文件本地连接

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 六.随机神经网络Boltzmann(玻尔兹曼机)

    Hopfield网络具有最优计算功能,然而网络只能严格按照能量函数递减方式演化,很难避免伪状态的出现,且权值容易陷入局部极小值,无法收敛于全局最优解. 如果反馈神经网络的迭代过程不是那么死板,可以在一 ...

  5. 组合数取模(lucas定理+CRT合并)(AC)

    #include<bits/stdc++.h> #define re register #define int long long using namespace std; ; inlin ...

  6. Statement对象

    Statement 对象 创建 Statement 对象 在你准备使用 Statement 对象执行 SQL 语句之前,你需要使用 Connection 对象的 createStatement() 方 ...

  7. C# 模拟POST上传图片

    做到一个上传图片的需求,网页已经可以了,模拟网页在客户端上传图片,试了很多次都没成功, 最后发现是少了一个换行符,而且是网页上的字符全部一字不漏的转换成文件流,上传. 先看下网页下的完整请求: 前面这 ...

  8. mysql实现行拼接、列拼接

    举例:有t_person表如下: 一.mysql行拼接: 拼接某一行: 无分隔符:select   CONCAT(id,idcard,`status`,content)   from  t_perso ...

  9. linux C 编译时手动链接遇到的问题(未解决)

    写多线程的时候,编译的时候遇到了问题,开始的时候是这样的: 编译器不认识pthread_create和pthread_join这两个函数. 搜了一下原因是没有链接相应的库,下面是我看到一个博友写的: ...

  10. openstack安装dashboard后访问horizon出错 500 or 504

    访问controller/horizon出错500:internal server error 访问controller/horizon出错504:internal server error  gat ...