this不对,怎么改写?-------阮老师的ES6

阮一峰老师的ES6 文章里关于把多参函数改写为Thunk函数的说明
任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式。下面是一个简单的 Thunk 函数转换器。

// 正常版本的readFile(多参数版本)
fs.readFile(fileName, callback);

//Thunk 函数转换器。
// ES5版本
var Thunk = function(fn){
  return function (){
    var args = Array.prototype.slice.call(arguments);
    return function (callback){
      args.push(callback);
      return fn.apply(this, args);
    }
  };
};

// ES6版本
const Thunk = function(fn) {
  return function (...args) {
    return function (callback) {
      return fn.call(this, ...args, callback);
    }
  };
};
//使用上面的转换器,生成fs.readFile的 Thunk 函数。
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback);

Thunk函数里面的this 有问题吧?
正常版本里的this 是 fs, Thunk里面的this是window。

我的分析对吗??如果对,那么怎么修正该Thunk 函数呢?

//我的测试用例
var a = 456;
var obj ={
    a : 123,
    fn: function(b,c){
        console.log(this.a)
    }
}
obj.fn() // 123

Thunk(obj.fn)()() //456 (全局的a ,肯定不对呀)
阅读 2.9k
3 个回答

不说废话上代码

var Thunk = function(fn){
  return function (){
    var args = Array.prototype.slice.call(arguments);
    return function (callback){
      args.push(callback);
      return function(obj){
        return fn.apply(obj, args);//这样呢
      }
    }
  };
};
var a=456;
var obj={
  a:123,
  fn:function(b,c){
    console.log(this.a);
  }
}
obj.fn();
Thunk(obj.fn)()()(obj);

或者这样

var Thunk = function(fn){
  return function (){
    var args = Array.prototype.slice.call(arguments);
    return function (callback){
      args.push(callback);
      return fn.apply(this, args);
    }
  };
};
var a=456;
var obj={
  a:123,
  fn:function(b,c){
    console.log(this.a);
  }
}
obj.fn();
Thunk(obj.fn)().bind(obj)();//用bind()绑定
新手上路,请多包涵

function f(m){
return m * 2;
}

f(x + 5);

// 等同于

var thunk = function () {
return x + 5;
};

function f(thunk){
return thunk() * 2;
}
上面代码中,函数 f 的参数 x + 5 被一个函数替换了。凡是用到原参数的地方,对 Thunk 函数求值即可。
这就是 Thunk 函数的定义,它是"传名调用"的一种实现策略,用来替换某个表达式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题