柯里化思想--JS中的预处理机制
2016-05-15 00:00
405 查看
摘要: 利用函数执行,可以形成一个"不销毁的私有作用域的原理",
把需要预先处理的内容都存储在这个不销毁的私有作用域中
并且返回一个小函数,以后我们执行的时候,执行的都是小函数
在小函数中,把之前预先存储的值进行相关的操作即可
bind()
var预处理
给元素绑定某个方法的时候,当该方法执行的时候,浏览器会自动给当前的方法传递一个参数值--事件对象.同时,该方法中的this是元素本身
此处 fn.call(obj)没有返回值,所以相当于
可以做如下修改
此处的bind就是利用了柯里化思想,将fn中的this"预处理"成了window
关于call 和 bind的区别,此处略去.bind在ie678下不兼容
Function.prototype.bind的原理:就是执行这个方法的时候,返回一个匿名函数
然后在匿名函数中把需要处理的函数以及this进行初始化
对于元素的事件绑定:如果使用了bind方法,预先处理了this,那么bind方法会把浏览器传递的事件对象放在当前函数的最后一个参数中
相当于 ->
我们重写一下,把myBind方法写在Function的原型上
柯里化思想:就是预处理机制
利用函数执行,可以形成一个"不销毁的私有作用域的原理", 把需要预先处理的内容都存储在这个不销毁的私有作用域中 并且返回一个小函数,以后我们执行的时候,执行的都是小函数 在小函数中,把之前预先存储的值进行相关的操作即可
bind()
var预处理
给元素绑定某个方法的时候,当该方法执行的时候,浏览器会自动给当前的方法传递一个参数值--事件对象.同时,该方法中的this是元素本身
var obj = {name:'我对象呢'} function fn(num1,num2) { console.log(this,num1+num2); } window.setTimeout(fn.call(obj),0);
此处 fn.call(obj)没有返回值,所以相当于
window.setTimeout(undefined,0)//并不会有输出
可以做如下修改
window.setTimeout(fn.bind(obj),0);// 输出obj
此处的bind就是利用了柯里化思想,将fn中的this"预处理"成了window
关于call 和 bind的区别,此处略去.bind在ie678下不兼容
Function.prototype.bind的原理:就是执行这个方法的时候,返回一个匿名函数
然后在匿名函数中把需要处理的函数以及this进行初始化
function myBind(callback,context){ // 我们模拟bind方法,让callback中的上下文变成我们传入的context context = context || window; // 获取给小函数传入的参数值 -> 这些参数值是除去callback和context之外的传参 var outAry = Array.prototype.slice.call(arguments,1); // 返回一个待执行的匿名函数 return function(){ // 我们的目的是通过bind返回一个函数 // 这个函数中的this已经被修改 // 函数不会被立即执行 //callback.call(context); callback.apply(context,outAry);//因为传入参数是一个类数组,所以从call改为apply } }
对于元素的事件绑定:如果使用了bind方法,预先处理了this,那么bind方法会把浏览器传递的事件对象放在当前函数的最后一个参数中
div1.onclick = fn.bind(obj,100,200);// -> 输出:obj, MouseEvent undefined
相当于 ->
//这是js中bind的原理,它默认把事件e传递给了fn的最后一个参数 div1.onclick = function(e){ fn.call(obj,100,200,e); }
我们重写一下,把myBind方法写在Function的原型上
Function.prototype.myBind = function(context){ var _this = this; var outerAry = Array.prototype.slice.call(arguments,1); return function(){ var innerAry = Array.prototype.slice.call(arguments,0); _this.apply(context,outAry.concat(innerAry)); } }
相关文章推荐
- Abot爬虫和visjs
- JS当中获取Web访问基路径
- Javascript对象的继承
- JS大总结(带实例)
- 【转】JsBridge实现JavaScript和Java的互相调用
- JS大总结(带实例)
- 【JavaScript】——匿名函数和闭包
- 简单分析JAVASCRIPT的基本类型和引用类型
- Javascript基础知识盲点总结——函数
- JSP中forward与sendRedirect在服务端路径问题
- js笔记之影音插入0514
- js将日期转换为毫秒值
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- 理解js中的闭包
- BZOJ1013 [JSOI2008]球形空间产生器sphere
- 匿名函数和字面量——JS学习
- JS 将字符串转换成日期类型
- JS学习笔记
- BZOJ 1013 [JSOI2008]球形空间产生器sphere
- 关于json对象和数组的访问的一些问题