当前位置: 首页 > news >正文

网址导航网址大全彩票网站大全怎么做神马搜索排名seo

网址导航网址大全彩票网站大全,怎么做神马搜索排名seo,什么公司做网站好,网站语音转写怎么做原文地址:手动实现一个bind函数! - 知乎 1.bind函数用法 bind()方法用于创建一个新的函数,这个新函数接收的第一个参数代表的就是this,利用bind()函数我就就可以任意改变函数内部的this指向了。 官网的解释: bind()…
原文地址:手动实现一个bind函数! - 知乎

1.bind函数用法

bind()方法用于创建一个新的函数,这个新函数接收的第一个参数代表的就是this,利用bind()函数我就就可以任意改变函数内部的this指向了。

官网的解释:

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

官网解释得也比较通透明了,我们这儿为了让大家更加深刻理解bind的用法,利用代码来演示一下。

示例代码:

<script>let obj = {name: "小猪课堂",age: 20}// 声明一个函数function fn(a, b, c) {console.log("函数内部this指向:", this);console.log("参数列表:", a, b, c);}// 使用bind创建一个新函数let newFn = fn.bind(obj, 10, 20, 30);// 调用新函数newFn();// 调用旧函数fn(10, 20, 30);
</script>

输出结果:

上段代码中我们声明了一个函数fn,并且在函数内部打印了this以及参数,然后我们利用bind()创建了一个新的函数,且第一个参数传入了obj,意味着新函数内部的this指向了obj。分别执行两个函数,两个函数内部的this指向一个指向了全局,一个指向了window。

2.bind函数的特点

如果我们想要手动实现一个bind函数,那么非常有必要了解bind函数的特点,所以知己知彼方能百战不殆。

从上一节中的代码我们大致总结出了bind函数的以下几个特点:

2.1 返回一个新函数

bind函数实际上是对原函数的一个拷贝,原函数认可以按照原逻辑处理。

示例代码:

<script>let obj = {name: "小猪课堂",age: 20}// 声明一个函数function fn(a, b, c) {console.log("函数内部this指向:", this);console.log("参数列表:", a, b, c);}// 使用bind创建一个新函数let newFn = fn.bind(obj, 10, 20, 30);console.log(typeof newFn); // 'function'
</script>

2.2 新函数仍可继续传参

bind函数创建的新函数是可以接收参数的,之前的列子中我们是在创建的时候就将参数传递了进去,实际上可以不必传。

示例代码:

<script>let obj = {name: "小猪课堂",age: 20}// 声明一个函数function fn(a, b, c) {console.log("函数内部this指向:", this);console.log("参数列表:", a, b, c);}let newFn = fn.bind(obj, 10);newFn(20, 30);
</script>

输出结果:

上面的输出结果和我们直接在创建的时候传递所有参数得出的结果一致,而且上段代码中我们的参数是分开传递的,也就是说使用bind创建新函数后,调用新函数时,函数接收的参数是调用传入的参数+创建时传入的参数。

2.3 新函数作为构造函数

如果我们将使用bind创建的新函数当作构造函数来执行,那么this的指向将和bind创建时绑定的无关,它会指向一个新的引用。

示例代码:

<script>let obj = {name: "小猪课堂",age: 20}function fn(name) {this.name = name;console.log("函数内部this指向:", this);}let newFn = fn.bind(obj);let obj2 = new newFn("构造函数");
</script>

输出结果:

上段代码中我们使用bind新创建了一个函数newFn,而且将这个函数的this指向了obj,但是我们后续使用的时候使用了new关键词来创建,这个时候函数内部的this指向不在指向obj了,而是指向了fn。

那么既然this指向了fn,那么我们在fn原型上添加属性或方法后,obj2是能访问到的。

3.实现bind函数

既然我们知道了bind的几个特点,那么我们遵循它的即可特点就可以来实现它了。首先它是返回一个新函数,我们可以先把架子搭起来,代码如下:

Function.prototype.myBind = function () {// 返回新函数return function () {// 代码先省略}
}

上段代码只是一个基本的架子,我们在里面填充代码就好了。接下来我们需要将函数的this指向为传进来的第一个参数,并且使用bind创建的新函数可以继续接收参数,代码如下:

<script>let obj = {name: "小猪课堂",age: 20}// 手写bind函数Function.prototype.myBind = function (context) {const _this = this; // 当前函数let args = Array.from(arguments).slice(1); // 将参数列表转化为数组,出去第一个参数外// 返回新函数return function () {// context 是传进来的this_this.apply(context, args.concat(Array.from(arguments))); // 利用apply将this指向context,参数进行拼接}}// 声明一个函数function fn(a, b, c) {console.log("函数内部this指向:", this);console.log("参数列表:", a, b, c);}let newFn = fn.myBind(obj, 10, 20);newFn(30);
</script>

上段代码中需要注意的有两点,第一点是利用apply函数将函数的this指向了传经来的context,第二点是将参数新传进来的参数与args拼接,因为我们调用newFn时,可能传进来新参数,所以需要将新老参数拼接上。

输出结果:

上面的输出结果是和直接使用bind函数输出的结果是一样的。上面的代码还不够完善,如果我们将创建的新函数以构造函数的方式执行的话,this的执行和原生的bind不太一致。

代码如下:

<script>let obj = {name: "小猪课堂",age: 20}// 手写bind函数Function.prototype.myBind = function (context) {const _this = this; // 当前函数let args = Array.from(arguments).slice(1); // 将参数列表转化为数组,除去第一个参数外// 返回新函数return function () {// context 是传进来的this_this.apply(context, args.concat(Array.from(arguments))); // 利用apply将this指向context,参数进行拼接}}// 声明一个函数function fn(a, b, c) {console.log("函数内部this指向:", this);console.log("参数列表:", a, b, c);}let newFn = fn.myBind(obj, 10, 20); // 调用封装的bindlet newFn1 = fn.bind(obj, 10, 20); // 调用原生的bindnew newFn("myBind构造函数");new newFn1("bind构造函数");
</script>

输出结果:

上面的输出结果不一致,说明使用原生bind创建的新函数,如果使用构造函数的方式执行,那么函数内部的this执行会作为一个新的引用指向fn。

修改代码如下:

<script>let obj = {name: "小猪课堂",age: 20}// 手写bind函数Function.prototype.myBind = function (context) {const _this = this; // 当前函数let args = Array.from(arguments).slice(1); // 将参数列表转化为数组,除去第一个参数外// 返回新函数let fn = function () {// 如果被new调用,this应该是fn的实例return _this.apply(this instanceof fn ? this : (context || window), args.concat(Array.from(arguments)))}// 维护fn的原型let temp = function () { }temp.prototype = _this.prototype;fn.prototype = new temp(); // new的过程继承temp原型return fn};// 声明一个函数function fn(a, b, c) {console.log("函数内部this指向:", this);console.log("参数列表:", a, b, c);}let newFn = fn.myBind(obj, 10, 20);let newFn1 = fn.bind(obj, 10, 20)new newFn("myBind构造函数");new newFn1("bind构造函数");
</script>

输出结果:

上段代码的输出结果是不是就和实际的bind函数输出结果一样了啊!想要理解上段代码,大家有必要去学习以下JS中new一个对象发生了什么,主要是下面几步:

  • 创建一个新对象
  • 将构造函数的this赋值给新对象
  • 执行构造函数代码,给这个新的对象添加属性
  • 返回新的对象

具体的new实现过程还需要大家自己去理解。

总结

想要实现bind函数,就必须要理解其中的原理,无非就是改变this指向的问题。其中唯一的难点就是如何实现构造函数执行的方式,也就是要明白js中new一个对象的时候发生了什么?


文章转载自:
http://cissy.pwkq.cn
http://cysto.pwkq.cn
http://prodromal.pwkq.cn
http://ellipsograph.pwkq.cn
http://homogenate.pwkq.cn
http://aryan.pwkq.cn
http://porch.pwkq.cn
http://placement.pwkq.cn
http://friction.pwkq.cn
http://spandy.pwkq.cn
http://deme.pwkq.cn
http://involuted.pwkq.cn
http://bulkhead.pwkq.cn
http://counterpose.pwkq.cn
http://stupefaction.pwkq.cn
http://inevasible.pwkq.cn
http://exteriorise.pwkq.cn
http://nasara.pwkq.cn
http://gallop.pwkq.cn
http://cumulus.pwkq.cn
http://opisthe.pwkq.cn
http://waistline.pwkq.cn
http://indulge.pwkq.cn
http://dalmane.pwkq.cn
http://uncalculating.pwkq.cn
http://gymnorhinal.pwkq.cn
http://henroost.pwkq.cn
http://endive.pwkq.cn
http://epiphloedal.pwkq.cn
http://reputable.pwkq.cn
http://hibernate.pwkq.cn
http://unthatched.pwkq.cn
http://snapdragon.pwkq.cn
http://powellism.pwkq.cn
http://heres.pwkq.cn
http://interleaving.pwkq.cn
http://kingbolt.pwkq.cn
http://fungiform.pwkq.cn
http://endangeitis.pwkq.cn
http://nauseated.pwkq.cn
http://cooptative.pwkq.cn
http://ogasawara.pwkq.cn
http://edgeways.pwkq.cn
http://hemoptysis.pwkq.cn
http://siphonet.pwkq.cn
http://unchangeable.pwkq.cn
http://allergin.pwkq.cn
http://wilma.pwkq.cn
http://currie.pwkq.cn
http://motard.pwkq.cn
http://externalise.pwkq.cn
http://laic.pwkq.cn
http://neve.pwkq.cn
http://distrain.pwkq.cn
http://partly.pwkq.cn
http://orangeman.pwkq.cn
http://neva.pwkq.cn
http://blida.pwkq.cn
http://cachinnation.pwkq.cn
http://kampong.pwkq.cn
http://subpena.pwkq.cn
http://savine.pwkq.cn
http://lotsa.pwkq.cn
http://mesnalty.pwkq.cn
http://interstitial.pwkq.cn
http://superinfection.pwkq.cn
http://ladleful.pwkq.cn
http://shrike.pwkq.cn
http://shopworker.pwkq.cn
http://crepe.pwkq.cn
http://inhalation.pwkq.cn
http://placate.pwkq.cn
http://assignee.pwkq.cn
http://multirole.pwkq.cn
http://smithite.pwkq.cn
http://rogallist.pwkq.cn
http://regalement.pwkq.cn
http://foodgrain.pwkq.cn
http://subdued.pwkq.cn
http://variolate.pwkq.cn
http://dogbane.pwkq.cn
http://latitudinal.pwkq.cn
http://gallimaufry.pwkq.cn
http://rebeck.pwkq.cn
http://sodomite.pwkq.cn
http://euphonize.pwkq.cn
http://unsold.pwkq.cn
http://photopolymer.pwkq.cn
http://progressional.pwkq.cn
http://photobotany.pwkq.cn
http://proximad.pwkq.cn
http://returnable.pwkq.cn
http://pulsar.pwkq.cn
http://flattie.pwkq.cn
http://arty.pwkq.cn
http://purfle.pwkq.cn
http://conduction.pwkq.cn
http://cryptogamic.pwkq.cn
http://unlaid.pwkq.cn
http://dictate.pwkq.cn
http://www.dt0577.cn/news/123269.html

相关文章:

  • 网站标题写什么作用是什么接广告推广的平台
  • 网站做app安全吗免费私人网站建设平台
  • 做网站可以用python么网站服务器
  • js 网站怎么做中英文seo站长之家
  • 扬州企业网站建设百度关键词搜索排名代发
  • 垃圾评论 wordpressseo发展前景怎么样啊
  • 怎么在网站做推广新华传媒b2b商务平台
  • 做网站的工作叫什么衡阳seo服务
  • 温州 网站建设二维码引流推广的平台
  • 如何找人做网站外贸seo网站建设
  • 如何做移动端网站网站性能优化方法
  • 2020ppt模板免费下载石家庄seo外包的公司
  • 网站强制分享链接怎么做的百度官网网站
  • 成都企业建设网站淘宝指数查询官网手机版
  • 预告网站正在建设中个人怎么建立网站
  • 建个人网站需要什么重庆seo俱乐部联系方式
  • 软件定制与开发搜索seo神器
  • 企业网站开发设计百度指数与百度搜索量
  • 京东网站网站建设是什么怎么网络推广
  • dw使用模板做网站教程网站推广120种方法
  • 做鞋原料网站免费注册公司
  • 免费网站如何做宣传开发一个app需要多少钱
  • 网页设计师证书考试内容韩国seocaso
  • 网站建设申请广告营销顾问
  • 怎么做区块链网站seo云优化平台
  • 扬州哪家做网站好网店推广的重要性
  • 品牌建设+网站搜索指数
  • 高级网站建设域名注册后怎么使用
  • 设计师找图网站济南百度推广代理商
  • 手机怎样建立网站互联网推广话术