You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionPerson(name,sex){console.log(this)// Person {}this.name=namethis.sex=sex}letobj={age: 100}letbindPerson=Person.bind(obj,'qianlongo')letp=newbindPerson('boy')console.log(p)// Person {name: "qianlongo", sex: "boy"}
实际上bind的使用是有一定限制的,在一些低版本浏览器下不可用,你想不想看看下划线中是如何实现一个兼容性好的bind呢!!!come on
下划线中bind实现
源码
_.bind=function(func,context){// 如果原生支持bind函数,就用原生的,并将对应的参数传进去if(nativeBind&&func.bind===nativeBind)returnnativeBind.apply(func,slice.call(arguments,1));// 如果传入的func不是一个函数类型 就抛出异常if(!_.isFunction(func))thrownewTypeError('Bind must be called on a function');// 把第三个参数以后的值存起来,接下来请看executeBoundvarargs=slice.call(arguments,2);varbound=function(){returnexecuteBound(func,bound,context,this,args.concat(slice.call(arguments)));};returnbound;};
前言
这是underscore.js源码分析的第五篇,如果你对这个系列感兴趣,欢迎点击
underscore-analysis/ watch一下,随时可以看到动态更新。
bind简单回顾
bind方法创建一个新的函数, 当被调用时,它的this关键字被设置为提供的值。
语法
简单地看一下这些参数的含义
绑定this作用域示例
通过以上简单示例,我们知道了第一个参数的作用就是绑定函数运行时候的
this
指向第二个参数开始起使用示例
bind可以使一个函数拥有预设的初始参数。这些参数(如果有的话)作为bind的第二个参数跟在this(或其他对象)后面,之后它们会被插入到目标函数的参数列表的开始位置,传递给绑定函数的参数会跟在它们的后面。
参数的使用基本上明白了,我们再来看看使用new去调用bind之后的函数是怎么回事。
有没有发现bindPerson内部的this不再是bind的第一个参数obj,此时obj已经不再起效了。
实际上bind的使用是有一定限制的,在一些低版本浏览器下不可用,你想不想看看下划线中是如何实现一个兼容性好的bind呢!!!come on
下划线中bind实现
源码
executeBound实现
上面的源码都做了相应的注释,我们着重来看一下
executeBound
的实现先看一下这些参数都代表什么含义
this
指向的上下文ok,我们来看一下第一句
这句话是为了判断绑定后的函数是以new关键字被调用还是普通的函数调用的方式,举个例子
所以如果你希望自己写的构造函数无论是
new
还是没用new
都起效的话可以用下面的代码我们回到
executeBound
的解析callingContext
是被绑定后的函数的this
作用域,boundFunc
就是那个被绑定后的函数,那么通过这个if判断,当为非new
调用形式的时候,直接利用apply
处理即可。但是如果是用
new
调用的呢?我们看下面这段代码,别看短短的四行代码里面知识点挺多的呢!好,到这里,我有一个疑问,
baseCreate
是个什么鬼?是不是好简单,就是实现了原生的Object.create用来做一些继承的事情。
结尾
js中call、apply、bind那些事
this-想说爱你不容易
The text was updated successfully, but these errors were encountered: