Закрытия означают, что вам нужно быть очень осторожным, что вы имеете в виду, когда говорите «сравни». Например:
function closure( v ) { return function(){return v} };
a = closure('a'); b = closure('b');
[a(), b()]; // ["a", "b"]
// Now, are a and b the same function?
// In one sense they're the same:
a.toString() === b.toString(); // true
// In another sense they're different:
a() === b(); // false
Возможность выйти за пределы функции означает, что в общем смысле сравнение функций невозможно.
Однако в практическом смысле вы можете проделать очень долгий путь с библиотеками разбора Javascript, такими как Esprima или Acorn. Это позволяет вам создать «Абстрактное синтаксическое дерево» (AST), которое представляет собой описание JSON вашей программы. Например, как ваши return 1
функции выглядят так:
ast = acorn.parse('return 1', {allowReturnOutsideFunction:true});
console.log( JSON.stringify(ast), null, 2)
{
"body": [
{
"argument": {
"value": 1, // <- the 1 in 'return 1'
"raw": "1",
"type": "Literal"
},
"type": "ReturnStatement" // <- the 'return' in 'return 1'
}
],
"type": "Program"
}
// Elided for clarity - you don't care about source positions
AST имеет всю информацию, необходимую для сравнения - это функция Javascript в форме данных. Вы можете нормализовать имена переменных, проверять замыкания, игнорировать даты и т. Д. В зависимости от ваших потребностей.
Существует множество инструментов и библиотек, которые помогут упростить процесс, но даже в этом случае это может быть много работы и, вероятно, не практично, но в основном это возможно.