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

Ошибка Javascript? Максимальный стек анонимных функций на строку

Потерпите меня на этом.

tl; dr Мой код работает, когда я устанавливаю новые строки между аргументами функции. Есть ли максимум в размере стека или объявлениях функций в строке в javascript?

Я тестировал свою гипотезу о том, что если вы достаточно креативны, все функции javascript могут быть переписаны (жертвуя скоростью и удобочитаемостью) без использования:

  • Пробелы или символы новой строки
    • (В дополнение, это предотвращает использование многих ключевых слов)
  • Объявленные типы данных (например, "", [], 0, false, {} и т.д.)
  • Более одного оператора для области
  • Операторы любого типа (включая логические и реляционные)

Или, в непрофессиональных терминах, вся функция должна соответствовать /^[a-zA-Z(){}.,]*$/.

Самая большая проблема, с которой я столкнулся до сих пор в процессе доказательства этой гипотезы (я не получил регулярных выражений, которые должны быть забавными) имеет дело с математикой, которая сильно зависит от операторов и чисел.

Я написал функции, которые следуют моим параметрам, и:

  • вычислить базовую арифметику (add(a,b) //a+b)
  • образуют целые числа (digs(one,three,six,eight) //1368)
  • получить и установить свойства объекта (setprop(a,b,c) //a[b]=c)

Общая идея состоит в том, чтобы структурировать такие функции, как показано ниже, чтобы сделать алгоритмы более читабельными и записываемыми таким образом:

function(...){(function(add,morefuncs...){algorithm...})(function(){...},morefuncs...)}

Мои функции работают индивидуально, так же как и в этой форме, когда их недостаточно, но, как я добавил больше, я заметил чрезвычайно необычную ошибку:

//For some reason, this breaks:
func(arguments,...,f1,f2)

//And this doesn't:
func(arguments,...,
    f1,f2)

Учитывая большое количество анонимных функций, требуемых моим кодом, я предположил, что существует максимальное количество анонимных функций, которые javascript может обрабатывать в одной строке, но я не могу найти документацию, в которой говорится это или иначе.

Вот три версии моего кода:

ВЕРСИЯ 1: Без символов перевода строки не работает

(function(){return(function(domath){return(domath)(function(getprop,setprop,add,sub,mlt,div,cct,digs,zero,one,two,three,four,five,six,seven,eight,nine){console.log(getprop,setprop)})})((function(){return(function(m,i,o,c,g,h){return(function(a,d){return(function(s,t){return(function(r,n){return(function(f){return(f).apply(null,Array(g,h,function(x,y){return(r(a(x,y)))},function(x,y){return(r(s(x,y)))},function(x,y){return(r(m(x,y)))},d,c,function(){return(Number(Object.keys(arguments).map(function(k){return(g(arguments,k))}).join(String())))}).concat(n))})})(function(x){return(Number(x.toFixed(t)))},Array(Number(),Math.exp(Number()),Array(Number(),String()).toString().length,Array(Number(),Number()).toString().length,Boolean(Math.exp(Number())).toString().length,Boolean(Number()).toString().length,Array(Boolean(),String()).toString().length,Array(Boolean(),Number()).toString().length,Array(Boolean(),Number(),String()).toString().length,Array(Boolean(),Number(),Number()).toString().length))})(function(x,y){return(Math.log(d(Math.exp(x),Math.exp(y))))},Number(c(String(o),String(Number()))))})(function(x,y){return(Math.log(m(Math.exp(x),Math.exp(y))))},function(x,y){return(m(x,i(y)))})})(function(x,y){return(Math.log(Math.pow(Math.exp(x),y)))},function(x){return(Math.pow(x,Array().indexOf(Number())))},Math.exp(Number()),function(x,y){return(Array(x,y).join(String()))},function(x,y){return(Object.getOwnPropertyDescriptor(x,y).value)},function(x,y,z){Object.defineProperty(x,y,Object.getOwnPropertyDescriptor(Array(z,Number()).slice(Number(),Math.exp(Number())),Number()))})})())})()

Журналы function anonymous(urn) function anonymous(urn) в Chrome. (Что такое "урна"? У меня нет переменных с этим именем, и только экземпляры этой строки находятся в "возвратных" ключевых словах.)

Журналы function anonymous() function anonymous() в Firefox.

ВЕРСИЯ 2: с одной новой строкой работает

(function(){return(function(domath){return(domath)(function(getprop,setprop,add,sub,mlt,div,cct,digs,zero,one,two,three,four,five,six,seven,eight,nine){console.log(getprop,setprop)})})((function(){return(function(m,i,o,c,g,h){return(function(a,d){return(function(s,t){return(function(r,n){return(function(f){return(f).apply(null,Array(g,h,function(x,y){return(r(a(x,y)))},function(x,y){return(r(s(x,y)))},function(x,y){return(r(m(x,y)))},d,c,function(){return(Number(Object.keys(arguments).map(function(k){return(g(arguments,k))}).join(String())))}).concat(n))})})(function(x){return(Number(x.toFixed(t)))},Array(Number(),Math.exp(Number()),Array(Number(),String()).toString().length,Array(Number(),Number()).toString().length,Boolean(Math.exp(Number())).toString().length,Boolean(Number()).toString().length,Array(Boolean(),String()).toString().length,Array(Boolean(),Number()).toString().length,Array(Boolean(),Number(),String()).toString().length,Array(Boolean(),Number(),Number()).toString().length))})(function(x,y){return(Math.log(d(Math.exp(x),Math.exp(y))))},Number(c(String(o),String(Number()))))})(function(x,y){return(Math.log(m(Math.exp(x),Math.exp(y))))},function(x,y){return(m(x,i(y)))})})(function(x,y){return(Math.log(Math.pow(Math.exp(x),y)))},function(x){return(Math.pow(x,Array().indexOf(Number())))},Math.exp(Number()),function(x,y){return(Array(x,y).join(String()))},
function(x,y){return(Object.getOwnPropertyDescriptor(x,y).value)},function(x,y,z){Object.defineProperty(x,y,Object.getOwnPropertyDescriptor(Array(z,Number()).slice(Number(),Math.exp(Number())),Number()))})})())})()

Журналы function anonymous(x, y) function anonymous(x, y, z).

ВЕРСИЯ 3: Благоустроенная для удовольствия просмотра

(function() {
  return (function(domath) {
      return (domath)(function(getprop, setprop, add, sub, mlt, div, cct, digs, zero, one, two, three, four, five, six, seven, eight, nine) {
          console.log(getprop, setprop)
      })
  })((function() {
      return (function(m, i, o, c, g, h) { //multiplication, inverse, one, concatenation, getObjectProperty, setObjectProperty
          return (function(a, d) { //add, divide
              return (function(s, t) { //subtract, ten
                  return (function(r, n) { //roundToTenDigits (fix for negatives), numbers (so you can call numbers as variables)
                      return (function(f) { //makes it so you don't have to re-initialize the functions every time you do math
                          return (f).apply(null, Array(g, h, function(x, y) {
                              return (r(a(x, y))) //modifies addition (rounds results like -2.999999999996)
                          }, function(x, y) {
                              return (r(s(x, y))) //modifies subtraction
                          }, function(x, y) {
                              return (r(m(x, y))) //modifies multiplication
                          }, d, c, function() { //makes a number out of its digits
                              return (Number(Object.keys(arguments).map(function(k) {
                                  return (g(arguments, k))
                              }).join(String())))
                          }).concat(n)) //adds all the numbers to the arguments array
                      })
                  })(function(x) {
                      return (Number(x.toFixed(t)))
                  }, Array(Number(), Math.exp(Number()), Array(Number(), String()).toString().length, Array(Number(), Number()).toString().length, Boolean(Math.exp(Number())).toString().length, Boolean(Number()).toString().length, Array(Boolean(), String()).toString().length, Array(Boolean(), Number()).toString().length, Array(Boolean(), Number(), String()).toString().length, Array(Boolean(), Number(), Number()).toString().length))
              })(function(x, y) {
                  return (Math.log(d(Math.exp(x), Math.exp(y))))
              }, Number(c(String(o), String(Number()))))
          })(function(x, y) {
              return (Math.log(m(Math.exp(x), Math.exp(y))))
          }, function(x, y) {
              return (m(x, i(y)))
          })
      })(function(x, y) {
          return (Math.log(Math.pow(Math.exp(x), y)))
      }, function(x) {
          return (Math.pow(x, Array().indexOf(Number())))
      }, Math.exp(Number()), function(x, y) {
          return (Array(x, y).join(String()))
      }, function(x, y) {
          return (Object.getOwnPropertyDescriptor(x, y).value)
      }, function(x, y, z) {
          Object.defineProperty(x, y, Object.getOwnPropertyDescriptor(Array(z, Number()).slice(Number(), Math.exp(Number())), Number()))
      })
  })())
})()

Я не думаю, что могу назвать это ошибкой в ​​javascript, учитывая природу того, что я пытаюсь выполнить, но было бы неплохо иметь документацию по максимальному количеству анонимных функций на строку, если она существует ( для минимизации больших библиотек, например).

Кто-нибудь видел что-нибудь подобное раньше? Любые советы?

Большое спасибо.

P.S. Пожалуйста, избегайте ответов "ваша гипотеза глупо". Это было бы хорошо.

РЕДАКТИРОВАТЬ: только обновление в разговоре:

Чтобы уточнить, я НЕ хочу, чтобы он выводил function anonymous() function anonymous(). Я хочу, чтобы он выводил function anonymous(x, y) function anonymous(x, y, z).

  • Chrome v43 не работает в Windows 8.1, Windows 7 или Mac OS X 10.

  • Firefox 39 не работает.

  • Chrome Canary v45 отлично работает. Другой пользователь говорит, что v44 также работает.

  • Я надеюсь, что, если возможно, совместим с кросс-браузером.

  • Я являюсь автором этого кода.

  • Если вы считаете, что мой код написан странным образом, вы явно не прочитали весь этот вопрос.

4b9b3361

Ответ 1

Современные версии Chrome, Opera, Safari и Edge работают номинально.

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

Было бы неплохо увидеть дополнительную документацию по этой проблеме в Mozilla или даже лучше, если Firefox присоединится к Chrome, Opera, Safari и Edge, правильно отображая аргументы функции.