Skip to content

Instantly share code, notes, and snippets.

@Josema
Last active May 9, 2016 08:57
Show Gist options
  • Save Josema/863fa0bac3682b197a1a1e02b18d794c to your computer and use it in GitHub Desktop.
Save Josema/863fa0bac3682b197a1a1e02b18d794c to your computer and use it in GitHub Desktop.
Convert arrow function into classic function in runtime
function isArrowFunction(f) {
return typeof f == 'function' && /^\([^)]*\)\s*=>/.test(f.toString());
}
function arrowFunctionToClassic(f) {
var string_function_converted = f.toString().replace(/\(([^)]*)\)\s*=>([\s\S]+)/, function(all, params, content) {
if ( content.substr(-1) != '}' )
content = '{return '+ content + ';}';
return 'function('+params+')'+content;
});
return eval('(' + string_function_converted + ')');
}
function convertObjectArrowFunctionToClassic( object ) {
for (var prop in object)
if ( isArrowFunction(object[prop]) )
object[prop] = arrowFunctionToClassic(object[prop]);
}
//////// TESTING
var obj = {
n: 25,
f1: function (a) { return this.n*a; },
f2: function f2(a) { return this.n*a; },
f3: (a) => this.n*a,
f4: (a)=> {
a*=2;
return this.n*a;
}
};
console.log('======= Before')
console.log(isArrowFunction(obj.f1), obj.f1(2)); // false 50
console.log(isArrowFunction(obj.f2), obj.f2.call({n:50}, 2)); // false 100
console.log(isArrowFunction(obj.f3), obj.f3(2)); // true NaN
console.log(isArrowFunction(obj.f4), obj.f4.call({n:50}, 2)); // True NaN
convertObjectArrowFunctionToClassic( obj );
console.log('======= After')
console.log(isArrowFunction(obj.f1), obj.f1(2)); // false 50
console.log(isArrowFunction(obj.f2), obj.f2.call({n:50}, 2)); // false 100
console.log(isArrowFunction(obj.f3), obj.f3(2)); // false 50
console.log(isArrowFunction(obj.f4), obj.f4.call({n:50}, 2)); // false 200
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment