Подтвердить что ты не робот

Вызов toString для функции javascript возвращает исходный код

Я только узнал, что когда вы вызываете toString() в функции javascript, как в myFunction.toString(), возвращается исходный код этой функции.

Если вы попробуете его в Firebug или консоли Chrome, он даже дойдет до его форматирования, даже для свернутых файлов javascript.
Я не знаю, что происходит для обфускации файлов.

Какая польза от такой реализации toString?

4b9b3361

Ответ 1

Он используется для отладки, поскольку он позволяет вам видеть код функции. Вы можете проверить, была ли перезаписана функция, и если переменная указывает на правильную функцию.

У него есть некоторые функции для обфускации кода javascript. Если вы хотите делать хардкорную обфускацию в javascript, вы можете превратить весь свой код в кучу специальных символов и не оставлять никаких цифр или букв. Этот метод в значительной степени зависит от возможности доступа к большинству букв алфавита, заставляя вызов toString всем с помощью +"" (пример: (![]+"")[+[]] is f). Некоторые буквы типа v могут быть доступны только при вызове toString на нативной функции, например [].sort. Буква v важна для обфускационного кода, так как позволяет вам вызвать eval, который позволяет выполнять любые, даже циклы, без использования каких-либо букв. Вот пример этого.

Ответ 2

function.ToString - возвращает строку, представляющую исходный код функции. Для объектов Function встроенный метод toString декомпилирует функцию обратно в исходный код JavaScript, который определяет функцию.

Прочитайте this на mozilla.

Ответ 3

Вы можете использовать его как реализацию для многострочных строк в источнике Javascript.

Как описано в этом сообщении в блоге от @tjanczuk, одним из серьезных неудобств в Javascript является многострочная строка. Но вы можете использовать .toString() и синтаксис для многострочных комментариев (/* ... */) для получения тех же результатов.

Используя следующую функцию:

function uncomment(fn){
  return fn.toString().split(/\/\*\n|\n\*\//g).slice(1,-1).join();
};

... вы можете передать многострочные комментарии в следующем формате:

var superString = uncomment(function(){/*
String line 1
String line 2
String line 3
*/});

В оригинальной статье было отмечено, что поведение Function.toString() не стандартизировано и, следовательно, является дискретным по реализации, и рекомендуемое использование было для Node.js(где можно использовать интерпретатор V8); однако сценарий, который я написал, кажется, работает на всех доступных мне браузерах (Chrome 27, Firefox 21, Opera 12, Internet Explorer 8).

Ответ 4

Хороший вариант использования - удаленный. Просто toString функцию в клиенте, отправьте ее по проводу и выполните ее на сервере.

Ответ 5

Мой вариант использования. У меня есть программа node, которая обрабатывает данные и создает интерактивные отчеты в виде файлов html/js/css. Чтобы сгенерировать функцию js, мой код node вызывает myfunc.toString() и записывает его в файл.