Javascript错误?每行匿名函数的最大堆栈数

Javascript错误?每行匿名函数的最大堆栈数,javascript,function,testing,Javascript,Function,Testing,请容忍我这件事 tl;dr My代码仅在函数参数之间放置换行符时有效。javascript中每行的堆栈大小或函数声明是否有最大值 我一直在测试我的一个假设,即如果你足够有创意,所有javascript函数都可以重新编写(牺牲速度和可读性),而无需使用: 空格或换行符 (通过扩展,这可以防止使用许多关键字) 声明的数据类型(例如,“,[],0,false,{}等) 每个作用域有多个语句 任何类型的运算符(包括逻辑运算符和关系运算符) 或者,用外行的话说,整个函数应该匹配/^[a-zA-Z(

请容忍我这件事

tl;dr My代码仅在函数参数之间放置换行符时有效。javascript中每行的堆栈大小或函数声明是否有最大值

我一直在测试我的一个假设,即如果你足够有创意,所有javascript函数都可以重新编写(牺牲速度和可读性),而无需使用:

  • 空格或换行符
    • (通过扩展,这可以防止使用许多关键字)
  • 声明的数据类型(例如,
    []
    0
    false
    {}
    等)
  • 每个作用域有多个语句
  • 任何类型的运算符(包括逻辑运算符和关系运算符)
或者,用外行的话说,整个函数应该匹配
/^[a-zA-Z(){},]*$/

到目前为止,在证明这个假设的过程中,我所面临的最大挑战(我没有接触到正则表达式,这应该很有趣)是处理数学,它严重依赖于运算符和数字

我已经编写了遵循我的参数的函数,并且:

  • 计算基本算术(
    add(a,b)//a+b
  • 形成整数(
    digs(一,三,六,八)//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()))})})())})()
在Chrome上记录
函数匿名(urn)函数匿名(urn)
。(什么是“urn”?我没有该名称的任何变量,该字符串的唯一实例在“return”关键字中。)

在Firefox上记录
function anonymous()function anonymous()

第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()))})})())})()
日志
函数匿名(x,y)函数匿名(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中的一个bug,但如果有文档说明每行匿名函数的最大数量(例如,为了最小化大型库),这将是一件好事

以前有人见过这样的东西吗?有什么建议吗

非常感谢

请避免回答“你的假设是愚蠢的”。那太好了

编辑:只是目前对话的更新:

为了澄清,我不希望它输出
function anonymous()function anonymous()
。我希望它输出
函数匿名(x,y)函数匿名(x,y,z)

  • ChromeV43无法在Windows8.1、Windows7或MacOSX10上运行

  • Firefox39不工作

  • 铬金丝雀v45工作完美。另一位用户说v44也可以工作

  • 我希望有跨浏览器的兼容性,如果可能的话

  • 我是这段代码的作者

  • 如果您认为我的代码编写方式很奇怪,那么您显然没有阅读整个问题


    • Chrome、Opera、Safari和Edge的现代版本名义上正在运行

      Firefox仍然不带参数地记录函数,但由于它现在在所有三个版本的代码中都统一记录函数,因此该错误似乎已经得到了解决。我认为这种显示选择是开发人员有意识的选择


      如果Firefox能够通过正确显示函数参数加入到Chrome、Opera、Safari和Edge中来,我们仍然可以看到Mozilla关于这个问题的更多文档,甚至更好。

      这可能与隐式
      有关在换行符上。我不这么认为,因为换行符是在争论之间。调用
      函数(a,;b)
      肯定不起作用。版本1对我来说很好。Chrome44.0.2403.89(64位),OSX10.10.Muhammad请阅读全文。Siguza,你在使用控制台,JSFIDLE,原始HTML,什么?这只是控制台上的一个显示问题
      function anonymous(urn)
      urn
      是代码返回语句的一部分。无论什么原因,Chrome都会把正确的参数显示搞砸。这并不意味着代码的工作方式不同。只要命名所有匿名函数并在VM中查找它们的代码,您就会看到这些函数及其参数都非常好。