博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScirpt 的 bind 函数究竟做了哪些事
阅读量:6687 次
发布时间:2019-06-25

本文共 2171 字,大约阅读时间需要 7 分钟。


ES5 实现 bind 函数如下

Function.prototype.bind = function(that){        var self = this,            args = arguments.length > 1 ? Array.slice(arguments, 1) : null,            F = function(){};        var bound = function(){            var context = that, length = arguments.length;            if (this instanceof bound){                F.prototype = self.prototype;                context = new F;            }            var result = (!args && !length)                ? self.call(context)                : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);            return context == that ? result : context;        };        return bound;    }复制代码

测试1

var bar = function() {        console.log(this.x)    }var foo = {  x: 3}var func = bar.bind(foo);func(); // 3复制代码

bar 函数绑定foo 中的x 值,然后输出3

bind 函数中最主要的是bound 函数,bound 函数做了哪些事呢?

首先context 存储传入的thatcontext 中,判断this instanceof bound ,那什么时候this instanceof bound == true 呢?在测试1中的案例中,this instanceof boundfalse ,打印此时的this 输出Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …} ,发现是window 对象,因为foo 本身就是在window 对象中。

所以此时直接执行self.call(context) ,返回执行的结果3 ,就是我们测试1中的结果。

那什么时候this instanceof bound == true 呢,而且此时还需要使用空函数F 来获取主函数的prototype

答案是实例化,什么时候实例化呢?

测试2

var bar = function() {    console.log(this.x)}bar.prototype.name = function(){  this.name = 'name';}var foo = {  x: 3}var func = bar.bind(foo);var newFunc = new func; // undefinednewFunc.name(); // name复制代码

bar.bind(foo) 进行实例化,此时因为进行了new 操作,new 操作做了什么呢,参考所以此时的this 为新生成的bound {} 对象,constructorbound 函数,所以此时this instanceof bound == true

那为什么bar.bind(foo)foo 对象传递的时候,没有输出3 而是undefined 呢?也是因为new 操作,当前的上下文已经是新生成的newFunc 函数了。而且当this instanceof bound == true 时,会把barprototype 赋给F 函数,而bound 函数返回的是new F ,所以这时barprototype 也赋给newFunc 了。

我们看看ES6的操作,结果和上述例子是一样的。

var bar = function() {    console.log(this.x)}bar.prototype.name = function(){    console.log('name')}var foo = {    x: 3}var func = bar.bind(foo);func(); // 3// 实例化var newFunc = new func; // undefined    newFunc.name(); // name复制代码

总结:

所以bind 函数总共做了哪几件事呢?

  • 没有实例化时,将传入对象的参数引用到当前函数,执行当前函数,返回结果
  • 实例化时,使用new 操作生成新函数,原函数的prototype 赋给新函数,执行新函数,并返回新函数

转载地址:http://pueao.baihongyu.com/

你可能感兴趣的文章
Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全
查看>>
linux设备驱动归纳总结(六):1.中断的实现【转】
查看>>
可重入函数与不可重入函数【转】
查看>>
js yield
查看>>
Docker 传奇之 dotCloud
查看>>
迅雷下载精简版
查看>>
ElasticSearch 基础<转载>
查看>>
如何使用SVN协调代源代码,多人同步开发
查看>>
shell脚本练习【转】
查看>>
java集合框架 hashMap 简单使用
查看>>
Web Worker
查看>>
$fn、$extends $fn.extends的用法,jquery的插件开发
查看>>
UDP丢包原因
查看>>
Kafka Consumer 启动测试类
查看>>
CSRF学习笔记之CSRF的攻击与防御以及审计【00x3】
查看>>
mysqldump
查看>>
Python操作MySQL数据库9个实用实例
查看>>
Nuget4.0 bug一粒
查看>>
MVC的项目部署成应用程序或虚拟目录路径的问题
查看>>
[c#] Html Agility Pack 解析HTML
查看>>