How to create a revocable function to grant/revoke access to any other function?

The following code will show you how to create a function ‘revocable’ that will be used to grant/revoke access to other functions.

The function that will be tested here is the add function to add 2 numbers. But the ‘revocable’ function is good enough to work for other functions as well.

function add (x, y) {
    return x + y;
}

Given below is the code for the ‘revocable’ function:

function revocable(fn) {
    var allow = true;
    return {
        invoke: function() {
            if(!allow) {
                throw new Error('Access revoked');
            }
            return fn.apply(this, arguments);
        },
        revoke: function() {
            allow = false;
        },
        grant: function() {
            allow = true;
        }
    }
}

var temp = revocable(add);

temp.invoke(3, 4); // 7

temp.revoke();

temp.invoke(3, 4); // Uncaught Error: Access revoked(…)

temp.grant();

temp.invoke(3, 4); // 7