如何将其与高阶函数绑定

How to bind this with Higher order functions

提问人:Ahmed Gaafer 提问时间:10/14/2020 更新时间:10/14/2020 访问量:414

问:

我在某个文件中有这个高阶函数

withTry.js

function withTry(func){
    return function(...args) {
        try{
            
            func(...args);
        }
        catch(error){
            console.log(`ERROR: ${error}`)
        }
    }
}

我正在尝试在另一个文件中调用它;

foo.js

const withTry = require('path');

function someClass(){
 this.m = null;
 this.s=0;
}

/*I am using the withTry in class prototypes*/
someClass.prototype.func = withTry(function(data){
 /* 
  The problem is here
  The value of "this" is global which makes sense because it refers to the global of the withTry HOF
*/

 console.log(this.s) /*undefined*/
 
});

我的问题是如何绑定“someClass”的“this”

JavaScript 绑定 高阶函数

评论

0赞 Geraint 10/14/2020
我假设你以某种方式打电话,你能补充一下你是怎么称呼它的吗?func

答:

4赞 Bergi 10/14/2020 #1

你不想绑定它,你希望通过以下方式传递动态值:this

function withTry(func) {
    return function(...args) {
        try {
            func.call(this, ...args);
//              ^^^^^^^^^^^
        } catch(error){
            console.log(`ERROR: ${error}`)
        }
    }
}

作为 call 的替代方法,您还可以使用 func.apply(this, args)。

接下来你要添加的是将返回值传回的语句:-)return

1赞 TKoL 10/14/2020 #2

我的回答与Bergi的答案基本相同:

function withTry(func){
    return function(...args) {
        try{
            
            // func(...args);
            func.apply(this, args)
        }
        catch(error){
            console.log(`ERROR: ${error}`)
        }
    }
}

function someClass(){
 this.m = null;
 this.s=2;
}

someClass.prototype.func = withTry(function(data){
 console.log(this.s); 
});

var x = new someClass();
x.func();

我意识到,因为你正在调用 ,返回的函数已经具有权利x.funcwithTrythis