b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

手写一个bind函数(大概)

电脑杂谈  发布时间:2019-05-13 10:20:09  来源:网络整理

std::bind函数_bind函数详解_c++ bind函数

昨天搜了下bind怎么实现,大家都在说bind的特征啊啥的,没搜到,今天有人问起来,我反问他要咋搜,他和我说柯里化。柯里化!!!它的最常用的表现形式不就是传说中的闭包的其中一种嘛!!!

I think! I can do it!!!我觉得我可以尝试着实现一下。

首先我们来回想this指向的几种可能性:

当函数作为一个对象的属性被调用时,‘.’ 前面是谁this就指向谁。如:obj.run()、obj.a.run(),run函数里的this就分别指向obj和a。

c++ bind函数_bind函数详解_std::bind函数

当给dom元素绑定事件时,方法里的this指向绑定的dom元素。bind函数详解如:app.onclick = function a(){},a里的this这时候指向app。

构造函数里的this指向它的实例。如:function A(){this.a = 1}; let b = new A(),这时A中的this就指向b。

以上都不是,this指向window,严格模式指向undefind。

想想我们可以使用可能性1,先来写个aplly方法:

c++ bind函数_std::bind函数_bind函数详解

先写个实验用具:

function sum(a, b) {
    return this.a + this.b
}
let obj1 = {
    a: 11,
    b: 7
}
let obj2 = {
    a: 1,
    b: 1,
}
复制代码

再写个初版仿生myApply:

function myApply(that, arg){ //接受that参数参数,作为未来this
    that = JSON.parse(JSON.stringify(that)) //给做个深拷贝,不影响原来的对象
    that.Fn = this  //给对象设置属性Fn,让它等于我们前面调用myApply的sum
    return that.Fn(...arg)  //用属性调用的方式执行函数,让this指向传入的that,放入参数
}
复制代码

c++ bind函数_bind函数详解_std::bind函数

4.将来处理方法的改动(1)跟着将来处理理论的老到和展开,跟着组织方法和组织活动内容的改动,处理的方法也必定随之改动。为了区别是否是创建控件的线程访问该控件,windows应用程序中每一个控件对象都有一个invokerequired属性,用来检查是否需要通过调用invoke方法完成其他线程对该控件的操作,如果该属性为true.说明是其他线程操作该控件,这时可以创建一个委托实例,然后调用控件对象的invoke方法,并传入需要的参数完成相应操作,否则可以直接对该控件对象进行操作,从而保证了其他线程安全操作本线程中的控件.。referencequeue队列的作用就是reference引用的对象被回收时,reference就被放到了这个队列里面,然后我们就可以在这个referencequeue拿到reference,执行我们自己的操作(至于什么操作就看你想怎么用了),所以这个队列起到一个对象被回收时通知的作用。

function myApply(that, arg = []){
    that = that!== null && typeof that === 'object'?that: {} //在this不为object时的处理
    that.Fn = this
    const result = that.Fn(...arg)
    delete that.Fn //使用完之后对that下的Fn进行删除
    return result
}
复制代码

完成后我们将myApply放到Function的原型上并测试看看它:

Function.prototype.myApply = myApply

console.log(sum1.myApply(obj1)) //18
console.log(sum2.myApply(null, [2, 3])) //5
复制代码

bind函数详解_c++ bind函数_std::bind函数

到这里apply方法就算写完了。bind函数详解

柯里化(curry):只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

生成一个唯一的文件名,其实tmpfile()就调用了此函数参数s用来保存得到的文件名,并返回这个指针,如果失败,返回null。函数参数: 就是调用这个函数的东西显示给这个函数用来处理的数据项, 函数返回后参数本身被废弃。但当母函数和其闭包都定义了参数时,由于在母函数体外是无法直接对闭包进行函数调用的,为了能够实现对闭包的调用,需要在母函数内增加一条返回闭包函数名本身的语句,这个时候调用母函数后返回的是一个闭包的函数对象,就可以通过这种方法间接调用闭包函数了。

function myBind(that, ...arg) { //创建时保存bind中传进来的arg
    const _Fn = this    //保存sum函数
    return function () {
        const args = [...arg, ...arguments]   //合并两次传递进来的参数
        return _Fn.myApply(that, args)  //调用sum函数的myApply方法
    }
}
复制代码

和前面一样,将myBind放到Function的原型上,并测试它:

Function.prototype.myBind = myBind

const sum3 = sum1.myBind(obj1)
console.log(sum3()) //18
const sum4 = sum1.myBind(obj1).myBind(obj2)
console.log(sum4()) //18

const sum5 = sum2.myBind(obj1, 5)
console.log(sum5(6)) //11
复制代码

参考


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-98336-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...