首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

手写JS函数的call、apply、bind

之所以要写这篇,是因为曾经面试被要求在白纸上手写bind实现  结果跟代码一样清晰明确,一阵懵逼,没写出来!  下面,撸起袖子就是干!~  把call、apply、bind一条龙都整一遍!...const _this = { name: 'YIYING' }// 参数为数组;方法立即执行fun.ownApply(_this, [1, 2])// 输出:YIYING3参考:前端手写面试题详细解答bind...定义与使用Function.prototype.bind(): developer.mozilla.org/zh-CN/docs/…// Function.prototype.bind()样例function...console.log(arg1 + arg2)}const _this = { name: 'YIYING' }// 只变更fun中的this指向,返回新function对象const newFun = fun.bind...(_this)newFun(1, 2)// 输出:YIYING3手写实现/** * 自定义bind实现 * @param context 上下文 * @returns {Function} */

1.2K20

手写JS函数的call、apply、bind

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

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

js原生函数之call和apply,bind

call 和 apply call 和 apply 和 bind 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。...js原生函数中的call和apply都不陌生,这两个方法的作用相似,接受两类参数。 第一类是context(上下文),传入的参数作为执行函数的上下文,也是要传入的第一个参数。...bind方法用于明确指定调用 this 方法。在作用域方面,类似于 call 和 apply 。当你将一个对象绑定到一个函数的 this对象时,你就会用到 bind。...(tom)());//reading bind 和 call的使用方式很类似,同样接受两部分参数,上下文this和作用函数的后续参数,下面是我猜想的bind的模拟实现方法。...和call的主要区别在于,bind返回的是一个新函数,而call这是直接执行了该函数

86900

参数绑定---bind函数

标准库bind函数 我们可以解决向check_size传递一个长度参数的问题。 方法是使用一个新的名为bind的标准库函数,它定义在头文件functional中。...可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表 调用bind的一般形式为: auto newCallable=bind(callable,...与bind函数一样,placeholders命名空间也定义在functional头文件中 bind的参数 我们可以用bind绑定给定可调用对象中的参数或重新安排其顺序。...标准库中还有一个cref 函数,生成一个保存const引用的类 与bind一样,函数ref和cref定义在头文件functional中 注意: 标准库中定义了两个分别为bindlst和bind2nd的函数...与bind类似,这两个函数接收一个函数做参数,生成一个可调用对象,该对象调用给定函数,并将绑定参数传递给它。 但是,这些函数分别只能绑定第一个或者第二个参数。

1.1K30

JS 手写: call、apply、bind

# Try it bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。...如果 bind 函数的参数列表为空,或者 thisArg 是 null 或 undefined,执行作用域的 this 将被视为新函数的 thisArg。 arg1, arg2, ......# 描述 bind() 函数会创建一个新的绑定函数(bound function,BF)。...# 示例 # 创建绑定函数 bind() 最简单的用法是创建一个函数,不论怎么调用,这个函数都有同样的 this 值。...只要将这些参数(如果有的话)作为 bind() 的参数写在 this 后面。当绑定函数被调用时,这些参数会被插入到目标函数的参数列表的开始位置,传递给绑定函数的参数会跟在它们后面。

1.5K30

jsbind函数那些你可能没想过的点

1 js中对一个bind返回的函数执行new时会怎样 function A(a,b){ this.a=a; this.b=b } var a = A.bind({x:1},1) var...2 js中当函数执行bind后再次执行bind或call时会怎样 var test = function(x,y){ console.log(this,arguments) } var a=test.bind...的bind函数说明中我们知道,当我们用一个函数调用bind的时候,返回的函数中会保存这三个参数。...所以最后调用call的时候执行的函数是目标函数,也就是调用了bind函数,传入的this也是bind调用时传入的,这些都是无法被修改的了,但是参数是调用bind和call时的叠加,这是我们唯一可以修改的地方...3 js中对bind返回的函数执行new的时候,instanceof的行为 function A(){ } var b = A.bind({}) var c = new b(); c instanceof

56610

一起手写JS函数的call、apply、bind

之所以要写这篇,是因为曾经面试被要求在白纸上手写bind实现  结果跟代码一样清晰明确,一阵懵逼,没写出来!  下面,撸起袖子就是干!~  把call、apply、bind一条龙都整一遍!...arg1 + arg2)}const _this = { name: 'YIYING' }// 参数为数组;方法立即执行fun.ownApply(_this, [1, 2])// 输出:YIYING3bind...定义与使用Function.prototype.bind(): developer.mozilla.org/zh-CN/docs/…// Function.prototype.bind()样例function...console.log(arg1 + arg2)}const _this = { name: 'YIYING' }// 只变更fun中的this指向,返回新function对象const newFun = fun.bind...(_this)newFun(1, 2)// 输出:YIYING3参考 前端进阶面试题详细解答手写实现/** * 自定义bind实现 * @param context 上下文 * @returns

28230

JS手撕(四) call、apply、bind、柯里化、偏函数

JS手撕(四)    call、apply、bind、柯里化、偏函数 call call()方法就是使用一个指定的this值和一个或多个参数来调用一个函数。...bind bind()也能够像上面一样,使用指定的this值,不过有一个很大的不同,那就是bind()是返回一个函数,而不是立即调用。...顺带提一下一个注意点:调用bind()时,可以传参,调用该方法返回的函数也可以传参。所以会有两拨参数。...,而是不够的参数直接把值当成`undefined` addPartial(7)(8); // 报错,不能像柯里化一样(有点点像低配柯里化) 参考 死磕 36 个 JS...手写题(搞懂后,提升真的大) - 掘金 GitHub - qianlongo/fe-handwriting: 手写各种js Promise、apply、call、bind、new、deepClone…

39040

boost::bind 不能处理函数重载 (error: no matching function for call to bind)

不过此时我仍怀疑是参数的问题,于是增加了一个同名的函数重载,参数照抄 create_task,结果就失败了;最神奇的是改为之前那版 start_task 也不行了,这才开始怀疑是函数重载的问题。...+ 函数重载" 得到一些新的方案 (不能加 boost,bing 坑我),主要分两种: 强制转换 模板参数 其实不管哪种方式,都是在 bind 无法区分重载函数的场景下,告诉 bind 我们要绑定的是哪个重载版本...为何对重载函数如此“无能为力”呢?...按理说根据提供给 bind 的参数,再匹配重载函数的参数列表,应该可以挑选正确的重载版本。...使用boost::bind和重载函数的访客模式 [6]. std::bind 和 成员函数中的重载函数 [7].  C++类重载函数的function和bind使用 [8].  C++ 闭包 探秘

1K50

重写手动实现bind函数

前面发了一篇文章,面试题目之原生实现call、apply、bind,这篇文章介绍了如何手动实现call、apply、bind,但是前不久重读这篇文章时发现了实现bind的代码不是很完善,我们看一段代码...this绑定为obj var changePerson = Person.bind(obj); // 直接调用构造函数,函数会操作obj对象,给其添加三个属性; changePerson(); //...我们得到结论:用bind改变了this指向的函数,如果用new操作符来调用,bind将会失效。...,用mybind函数改变了构造函数的this,然后用new来执行生成的新函数,能否得到和原生bind一样的效果,测试代码如下: function Person(){ this.name="zs";...我们用上面实现的mybind改变函数的this,然后调用new方法,发现并未实现和原生bind一样的效果,我们实现的mybind方法和原生的bind实现的功能还有些差距,那么我们如何修正呢?

1.4K32

JS中call 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

js call()、apply()、bind()用法和区别

参数,那么 Window对象被用作 thisArg; 将arg1等参数传递进fun函数中,返回fun函数的返回值。...() 语法: fun.bind(thisArg,[arg1,arg2,…]) fun: 表示一个函数 thisArg: this要指向的对象,如果是null 和 undefined,则指向window全局对象...特性: fun.bind(thisArg,arg1,arg2,…) 不会立即调用fun函数,会返回一个新的指定了this的函数bind方法将一个函数的对象上下文从初始的上下文改变为由 thisArg...(obj, 1, 2); // 返回的是一个新的指定了this的函数 newFun(); // 3 4. call()、apply()和bind()的应用 1. call() call 常用来继承,因为...() 如果我们想改变某个函数内部的this指向,但又不需要立即调用该函数,此时用bind: 点击 let

1.1K30

apply、call、bind函数的区别

apply、call、bind函数的区别 一、前言 大多数人都知道,使用apply、call、bind可以调用函数,并改变函数中this的指向。 做一个简单记录,免得以后忘记了。...= user.showInfo.bind(other); showInfo2(other.age, other.sex); 可以看到,bind在使用的时候会返回一个改变this的新函数,使用需要重新调用这个新函数才行...、bind他们的异同点 相同点:都可以改变函数中this的指向,且都将作为第一个参数进行使用 不同点(传参方面) apply:在传入改变this的对象之后,将原来的函数参数,打包成一个数组进行传参...call:在传入改变this的对象之后,依次传入原本的函数参数 bind:由于特性,它的传参分为一次参数和二次传参,一次传参与call相同;二次传参首次传参与call类似,后一次调用传参补全原函数剩余的参数...不同点(调用方面) apply、call:函数.apply()或者函数.call(),即可发起调用 bind:先返回一个改变指向的函数,再通过这个函数进行调用 我是半月,祝你幸福!!!

31810

js中call、apply、bind那些事

前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call、apply、bind的问题,比如… 怎么利用call、apply来求一个数组中最大或者最小值 如何利用call、apply来做继承 apply...作用 首先问个问题,这三个函数的存在意义是什么?答案是改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向。有了这个认识,接下来我们来看一下,怎么使用这三个函数。...所以其实他们干的事从本质上讲都是一样的动态的改变this上下文,但是多少还是有一些差别的.. call、apply与bind的差别 call和apply改变了函数的this上下文后便执行该函数,而bind...则是返回改变了上下文后的一个函数。...67,5,7,6,-8,687);Math.min.apply(Math, arr);Math.min.call(Math, 34,5,3,6,54,6,-67,5,7,6,-8,687); 将伪数组转化为数组 js

1.7K50
领券