所以mybind在fn.apply的第一个参数,做了这样的判断this instanceof fBound ? this : context。 在const obj = new bindFoo('18')内部执行到this instanceof fBound ? this : context时,此刻this指向obj,fBound其实也就是bindFoo,this instanceof fBound判断了obj是不是继承自bindFoo,也就是进行了构建函数ne...
apply、call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply、call和bind都实现在了Function的原型上(Function.prototype),而他们的作用都是给我们函数调用时显式绑定上this。下面先介绍一下它们的基本用法:apply方法:调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式...
getName.call(obj, 'str1', 'str2') apply: Math.max.apply(null, [2, 3, 1, 4]) 2.bind() bind()方法会创建一个新函数,称为绑定函数。bind是ES5新增的一个方法,不会执行对应的函数,而是返回对绑定函数的引用。 fun.bind(thisNew[, arg1[, arg2[, ...]]]); 用例: var $ = document.que...
bind的实现 bind方法和其它两个方法的区别在于:bind方法是返回一个函数,而其它两个方法是直接返回执行结果。 实现思路和call基本相同,因为bind不需要返回执行结果,所以不需要用eval,而是需要通过返回一个函数的方式将结果返回,之后再执行这个结果,得到想要的结果。 具体实现思路如下: 拷贝源函数: 通过变量存储源函数 使...
call、apply和bind方法是JavaScript的三个基本方法,它们都可以用来改变函数执行上下文中的this值。其中,call和apply方法是直接对函数进行调用,并且允许我们在调用时手动传入this指向的对象和函数参数,两者的区别在于参数的传递方式不同:call方法的参数是一个一个地传入,而apply方法的参数是一个数组或类数组对象形式...
在如今的前端面试中,会用call、apply、bind已经达不到要求了,要能够知道原理并手写实现。 原生call的使用 先看一下原生call的使用方式。 function fn() { console.log(this.name); } let obj = { name: "微信公众号: Code程序人", }; fn.call(obj); ...
bind、call、apply 的不同点 bind 会返回一个新的函数,目标函数在新函数调用时才会执行 let newFunc = obj.myFn.bind(newObj,'北京','上海'); newFunc(); 1. 2. call 的传参方式与bind相同(第2-N个参数用,分隔),但目标函数会立即执行 obj.myFn.call(newObj,'北京','上海') ...
而bind 和(call、apply)又不同,bind 虽然改变了 func 的 this 指向,但不是马上执行,而(call、apply)是在改变了函数的 this 指向之后立马执行 2.2 apply 和 call 的实现 Function.prototype.call=function(context,...args){varcontext=context||window;context.fn=this;varresult=eval('context.fn(...args)...
apply实现 apply的功能和call的功能是非常相似的,只有传入的第二个参数参数有区别,call的传入的剩余参数,apply传入的是数组 Function.prototype.yqapply=function(thisArgs,arrArgs){//1.获取到调用的函数varfn=this;//2.处理thisArgs的边界判断thisArgs=thisArgs!==null&&thisArgs!==undefined?Object(thisArgs):wi...