js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind。
var obj = {
color: 'green'
}
function demo () {
console.log(arguments)
console.log(this.color)
}
var newFn = demo.bind(obj,1,1,1)
newFn(2,2,2)
bind改变函数作用域的方式和call和apply的不同点在于,call和apply是改变作用域的同时也会执行函数。而bind改变作用域会生成一个新函数,是否执行可以根据具体需求设置。
模拟这个bind方法的代码如下:
var obj = {
color: 'green'
}
function demo () {
console.log(arguments)
console.log(this.color)
}
/*
* bind1 模拟bind方法
* @fn 需要执行的函数
* @obj 传入的作用域
*/
var bind1 = function (fn, obj){
//取从索引值为2开始的后边的所有参数,生成数组
var paramArr = [].slice.call(arguments,2);
return function(){
//拼接两次传入的除了fn和作用域之后的参数
fn.apply(obj, paramArr.concat([].slice.call(arguments,0)))
}
}
var curFn = bind1(demo, obj, 3,3,3)
curFn(4,4,4)
另外一种给函数添加方法的代码为:
var obj = {
color: 'green'
}
function demo () {
console.log(arguments)
console.log(this.color)
}
if(Function.prototype.bind === undefined){
Function.prototype.bind = function (obj) {
var paramArr = [].slice.call(arguments, 1);
var that = this;
return function () {
that.apply(obj, paramArr.concat([].slice.call(arguments, 0)))
}
}
}
var curFn = demo.bind1(obj,1,1,1)
curFn(2,2)