Копирование содержимого функции стрелки в обычную функцию - PullRequest
0 голосов
/ 29 мая 2018

Я читал о функциях со стрелками и обнаружил, что их контекст не может быть изменен.

Я создавал модуль, который получает функцию, а затем меняет ее контекст.Но так как пользователь мог вводить функцию стрелки, я не смог этого сделать.

Поэтому мне было интересно, если, поскольку невозможно изменить контекст функции стрелки, я мог бы скопировать ее содержимое и создать новыйфункция, которая делает то же самое, но теперь с управляемым контекстом.

Есть идеи, как этого достичь?

Примером является что-то вроде этого:

class Foo {
    constructor(name) {
        this.name = name;
    }

    sayMyName() {
        console.log(this.name);
        return this.name;
    }
}

class Scope {
    constructor(reqId) {
        this.foo = new Foo('Hi!');
        this.reqId = reqId;
    }

    do(callback) {
        const func = callback.bind(this, this);
        func();
    }
}

class Controller {
    constructor() {
        this.foo = new Foo('Hello!');
    }

    unscoped(req, res, next) {
        var a = 1;
        res.json({
            success: this.foo.sayMyName()
        });
    }

    scoped(req, res, next) {
        req.scope.do((ctx) => {
            var a = 1;
            res.json({
                success: this.foo.sayMyName()
            });
        });
    }
}

Iхотите this.foo.sayMyName() вернуть 'hi' в Controller.scoped и 'hello' в Controller.unscoped

1 Ответ

0 голосов
/ 29 мая 2018

Ни Function.prototype.bind, ни Function.prototype.call, ни Function.prototype.apply не могут использоваться в функциях стрелок для изменения их контекста.

var arrowFunc = () => {console.log(this === myObject);};

var functionExpression = function() { console.log(this === myObject); };

var myObject = { id : "sampleObject"};

var boundFunctionExpression = functionExpression.bind(myObject);
console.log("Function expression bound with Function.prototype.bind :");
boundFunctionExpression();

var boundArrowFunc = arrowFunc.bind(myObject);
console.log("Arrow function bound with Function.prototype.bind :");
boundArrowFunc();

console.log("Arrow function called with Function.prototype.call :");
arrowFunc.call(myObject);
console.log("Arrow function called with Function.prototype.apply :");
arrowFunc.apply(myObject, []);

Так что нет, я не думаю, что вы можете достичь этого.

Подробнее о различиях между функцией стрелки и выражениями / объявлениями функций.

...