首页
学习
活动
专区
工具
TVP
发布

手写实现 js bind,并实现 softBind

// bind会返回一个硬绑定新函数,新函数会使用指定第一个thisCtx去调用原始函数,并将其它参数传给原始函数。...硬绑定会降低函数灵活性,在绑定之后不能通过显式或硬绑定方式改变this,只能通过new改变 // softBind 会对指定函数进行封装,首先检查调用时 this,如果 this 绑定到全局对象或者...(); // 3,10 let fb66 = fb22.myBind({ a: 6 }, 10)(); // 2,10 // fb66(); // 2,10 // 结论:bind方法链式调用,都以第一次...bind绑定为准,所以叫硬绑定,原理为 下一次 调用bind方法为上一个bind方法返回闭包,已经将 context、args 存储好并固定返回了 // 参考链接:https://juejin.cn...改变this 指向

70310

说下jsbind

bind受体是对象,返回是个新函数。 我们知道this总是指向调用他对象。但是有时候我们希望‘固化’这个this。 也就是无论怎么调用这个返回函数都有同样this值。...这就是bind作用。 语法 fun.bind(thisArg[, arg1[, arg2[, ...]]]) 参数 thisArg 当绑定函数被调用时,该参数会作为原函数运行时 this 指向。...this将永久地被绑定到了bind第一个参数,无论这个函数是如何被调用。 arg1, arg2, ... 当绑定函数被调用时,这些参数将置于实参之前传递给被绑定方法。...func2 = sayColor.bind(this); // 输出 "red", 因为传是this,在全局作用域中this代表 window。...func2(); 例2 注意:bind只生效一次 function f(){ return this.a; } //this被固定到了传入对象上 var g = f.bind({a:"azerty

2.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

JScall apply bind用法

谁调用当前属性或者方法,它就是谁 /* 2.1.bind方法作用 修改函数或者方法this为指定对象, 并且会返回一个修改之后新函数给我们 注意点...: bind方法除了可以修改this以外, 还可以传递参数, 只不过参数必须写在this对象后面 */ //call apply bind修改this.../*call:修改函数或者方法this为指定对象, 并且会立即调用修改之后函数 注意点: call方法除了可以修改this以外, 还可以传递参数, */.../*apply:修改函数或者方法this为指定对象, 并且会立即调用修改之后函数 注意点: apply方法除了可以修改this以外, 还可以传递参数, 只不过参数必须通过数组方式传递...console.log(this); } test(10,20); window.test(); let fn=test.bind

2.9K30

JSbind、apply、call理解

概要 call、apply、bind 都是用来修改函数this, 传参时,call是一个个传参,apply是数组形式传参,call和apply立即执行并且返回值是你调用方法返回值,若该方法没有返回值...bind是改变this后返回一个新函数,他不会立即执行。 这三个方法不会改变原方法this指向。 Bind 复制原方法传入新this指向后生成新方法,参数可传多个。...console.info(this.name + "和" + name + "一块玩"); } }; let b = { name: "小红" }; a.play("小刚"); a.play.bind..." }; a.play("小刚", "小李"); a.play.apply(b, ["小刚", "小李"]); 显示 小明和小刚、小李一块玩 小红和小刚、小李一块玩 结论: call、apply、bind...是Function.prototype下方法,作用是执行一下目标函数,执行时顺便把目标函数this改一下,然后把结果输出,执行后,不会影响原函数this!

92410

jscall、apply、bind那些事

前言 回想起之前一些面试,几乎每次都会问到一个js关于call、apply、bind问题,比如… 怎么利用call、apply来求一个数组中最大或者最小值 如何利用call、apply来做继承 apply...(animal)(); 啦啦啦,有木有很神奇,控制台输出了三次cat 我们拿别人showName方法,并动态改变其上下文帮自己输出了信息,说到底就是实现了复用 区别 上面看起来三个函数作用差不多,...所以其实他们干的事从本质上讲都是一样动态改变this上下文,但是多少还是有一些差别的.. call、apply与bind差别 call和apply改变了函数this上下文后便执行该函数,而bind...伪数组(例如通过document.getElementsByTagName获取元素)具有length属性,并且可以通过0、1、2…下标来访问其中元素,但是没有Arraypush、pop等方法...length属性 ) 数组追加 在js要往数组添加元素,可以直接用push方法, 1234567 var arr1 = [1,2,3];var arr2 = [4,5,6];[].push.apply

1.7K50

jscall、apply、bind那些事

前言 回想起之前一些面试,几乎每次都会问到一个js关于call、apply、bind问题,比如… 怎么利用call、apply来求一个数组中最大或者最小值 如何利用call、apply来做继承 apply...(animal)(); 啦啦啦,有木有很神奇,控制台输出了三次cat 我们拿别人showName方法,并动态改变其上下文帮自己输出了信息,说到底就是实现了复用 区别 上面看起来三个函数作用差不多,干的事几乎是一样...call、apply、bind常见应用场景。...伪数组(例如通过document.getElementsByTagName获取元素)具有length属性,并且可以通过0、1、2…下标来访问其中元素,但是没有Arraypush、pop等方法...length属性 ) 数组追加 在js要往数组添加元素,可以直接用push方法, var arr1 = [1,2,3]; var arr2 = [4,5,6]; [].push.apply

1.6K60

jsthis指向问题及call,apply,bind区别

jsthis指向问题及call,apply,bind区别# 1 this指向# 1.1 what is 'this'?...# 在 ECMAScript 5 ,函数内部存在两个特殊对象:arguments(一个类数组对象,包含调用函数时传入所有参数) 和 this(本文将要讲)。...1.2 标准函数与箭头函数this指向# this在标准函数与箭头函数时会有两种不同类型指向行为。...1.2.1 标准函数this指向# 在标准函数,this 指向是把函数当成方法调用的上下文对象。也就是说在哪里调用这个函数,那这个this只会指向它外面最靠近它对象。...可以向cally一样传参,例如: a.say.bind(b, '男', 'UNO')() // 但由于bind返回仍然是一个函数,所以我们还可以在函数调用时候再进行传参。

1.1K20

JavaScriptcall,apply,bind方法使用及原理

当我们定义一个新对象,需要使用其他对象方法时候,我们不需要重新开发重复方法逻辑,借助apply,apply,bind三个方法可以实现对这些方法调用。...bind()方法创建一个新函数,在bind()被调用时,这个新函数this被bind第一个参数指定,其余参数将作为新函数参数供调用时使用,第一个thisArg在setTimeout创建一个函数时传递原始值都会转化成...特点: apply,call,bind三个方法第一个参数都是函数在调用时this指向对象,也就是运行时上下文(this显示绑定原理) apply,call第一个参数为空,null,undefined...(cacheFun); cacheNameByBind(); // Name is cache 实现原理 apply Function.prototype.applyFun = function(content...、使用场景及实现 MDN(Function) MDN(Function.prototype.bind())

1.1K20

Jscall vs apply vs bind及记忆方式

前言 jscall(), apply()和bind()是Function.prototype下方法,都是用于改变函数运行时上下文,最终返回值是你调用方法返回值,若该方法没有返回值,则返回undefined...call() call()是apply()一颗语法糖,作用和apply()一样,同样可实现继承,唯一区别就在于call()接收是参数列表,而apply()则接收参数数组。 ?...bind() bind()作用与call()和apply()一样,都是可以改变函数运行时上下文,区别是call()和apply()在调用函数之后会立即执行,而bind()方法调用并改变函数运行时上下文后...用apply()模拟实现bind(): ?...、apply()和bind()都是用来改变函数执行时上下文,可借助它们实现继承;call()和apply()唯一区别是参数不一样,call()是apply()语法糖;bind()是返回一个新函数,供以后调用

1.4K40

通过自己实现函数 call,apply,bind 来了解他们原理

我们知道函数call,apply,bind都是可以修改函数this指向。关于函数this指向问题可以转到Javascript this 指向问题这篇文章。...函数内部实现在这个传入对象绑定上我们需要执行这个函数,即context.fn = this一行。最后调用context.fn()。...bind实现 原生bind有两种方式 var tal = { name: "踏浪", sex: "男" } function person(age) { console.log(age...使用bind都需要调用两次,而第一次就是返回一个函数。原函数参数可以在bind调用,也可以在第二次运行时候调用。...call, apply, bind 这三种方法,能够更深刻理解到这三个函数原理,同时涉及到只是点也多:this指向,arguments类数组,每一个对象都要toSting方法(另一个是valueOf

76540

手写JS函数call、apply、bind

之所以要写这篇,是因为曾经面试被要求在白纸上手写bind实现  结果跟代码一样清晰明确,一阵懵逼,没写出来!  下面,撸起袖子就是干!~  把call、apply、bind一条龙都整一遍!...;方法立即执行fun.call(_this, 1, 2)// 输出:YIYING3手写实现/** * 自定义call实现 * @param context 上下文this对象 * @param args...arg2) { console.log(this.name) console.log(arg1 + arg2)}const _this = { name: 'YIYING' }// 只变更fun...this指向,返回新function对象const newFun = fun.bind(_this)newFun(1, 2)// 输出:YIYING3手写实现/** * 自定义bind实现 * @param...arg2) { console.log(this.name) console.log(arg1 + arg2)}const _this = { name: 'YIYING' }// 只变更fun

1.2K20

Javascriptbind详解

' console.log((function(){}).bind().length); // 0 由此可以得出结论2: 1、调用bind函数this指向bind()函数第一个参数。...original原函数this指向就是这个新对象。 另外前不久写过一篇文章:面试官问:能否模拟实现JSnew操作符。简单摘要: new做了什么: 1.创建了一个全新对象。...所以相当于new调用时,bind返回值函数bound内部要模拟实现new实现操作。 话不多说,直接上代码。...3、es5-shim源码模拟实现bind时用Function实现了length。 事实上,平时其实很少需要使用自己实现投入到生成环境。但面试官通过这个面试题能考察很多知识。...另外觉得写得不错,可以点个赞,也是对笔者一种支持。 文章例子和测试代码放在githubbind模拟实现 github。

1.6K32

手写JS函数call、apply、bind

之所以要写这篇,是因为曾经面试被要求在白纸上手写bind实现  结果跟代码一样清晰明确,一阵懵逼,没写出来!  下面,撸起袖子就是干!~  把call、apply、bind一条龙都整一遍!...;方法立即执行fun.call(_this, 1, 2)// 输出:YIYING3手写实现/** * 自定义call实现 * @param context 上下文this对象 * @param args...arg2) { console.log(this.name) console.log(arg1 + arg2)}const _this = { name: 'YIYING' }// 只变更fun...this指向,返回新function对象const newFun = fun.bind(_this)newFun(1, 2)// 输出:YIYING3手写实现/** * 自定义bind实现 * @param...arg2) { console.log(this.name) console.log(arg1 + arg2)}const _this = { name: 'YIYING' }// 只变更fun

1K30
领券