很多JavaScript库实现了一个可以将函数绑定到指定环境的函数,这个函数一般都叫做bind()。一个简单的bind()函数接受一个函数和一个环境,并返回一个给的环境中调用给定函数的函数,并且将所有参数原封不动传递过去。这个函数返回的是一个闭包。
上面的语言描述总是很虚无飘渺,我们来直接上Demo:
1-4-1 Demo var obj1 = { name: 'zhang', getName: function() { console.log(arguments[0][2], 'obj1') return this.name } } var obj2 = { name: 'lisi', getName: function() { console.log(arguments, 'obj2') return this.name } } function Bind(fn, context) { return fn.call(context, arguments) } Bind(obj1.getName,obj2,'xxxxx') // Arguments [Arguments(3), callee: ƒ, Symbol(Symbol.iterator): ƒ] "obj1" // 'lisi' // 这里我们对于 arguments 的 理解和操作来说都是比较陌生,那么下面 我们再来介绍下 // arguments 具体是什么。 1-4-2 arguments类数组 (Array-like)
可以用下标访问每个元素
有 length 属性
arguments 的数据类型为 object
可以使用 for 和 for-in 方法
不具备 Array 原生方法
Demo
var test = function() { console.log(arguments) console.log(arguments[0]) console.log(arguments.length) console.log(typeof arguments) for(var i = 0; i<arguments.length; i++) { var ele = arguments[i] console.log(ele) } for(x in arguments) { console.log(arguments[x]) } // arguments.split(' ') // Uncaught TypeError: arguments.split is not a function } test(1,2,3,4) // Arguments(4) [1, 2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ] // 1 // 4 // object // 1 2 3 4 // 1 2 3 4将类数组 转化为 数组
方法一 :
var test = function() { console.log(arguments) var arrArg = Array.prototype.slice.call(arguments) console.log(arrArg) } test(1,2,3,4) // [1, 2, 3, 4]方法二 :
var test = function() { console.log(arguments) var arrArg = Array.from(arguments) console.log(arrArg) } test(1,2,3,4) // [1, 2, 3, 4] 1-4-3 ES5 中原生 bind() 方法 详解文字解释起来还是比较吃力,那么我们还是 showCode~
Demo:
bind是function的一个函数扩展方法, bind 以后代码重新绑定了 func 内部的 this 指向(obj)
兼容 IE9 +
Demo:
又称部分求值。柯里化其实本身是固定一个可以预期的参数,并返回一个特定的函数,处理批特定的需求。
这增加了函数的适用性,但同时也降低了函数的适用范围。
文字的定义始终让人难以接受,还是 showCode 吧
Demo:假设你要写一个 记账的工具,然后记录每天的数据,最后统计整个星期的数据。
how ?
小结一:
上面的 dmeo 中,当调用 cost() 时,如果明确带上参数,表明此时并不进行真正的求值计算,而是把这些参数保存起来,此时让 cost() 函数返回另外一个函数。只有当我们以不带参数的形式执行 cost() 时,才利用前面保存的所有参数,真正开始求值计算。这是一个具象的函数颗粒化的方法。那么我们想把函数颗粒化抽象出来又需要怎么来概括呐?