请耐心听我说。
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()))})})())})()
Logs function anonymous(urn) function anonymous(urn)
on Chrome。(什么是"瓮"?我没有任何该名称的变量,该字符串的唯一实例是在"return"关键字中。
Firefox的function anonymous() function anonymous()
日志。
版本2:使用一个换行符,works
(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中的bug,但是如果存在的话,最好有关于每行匿名函数的最大数量的文档(例如,最小化大型库)。
有人见过这样的东西吗?任何建议吗?
谢谢你。
注:请避免回答"你的假设是愚蠢的"。那太好了。
编辑:只是对到目前为止的对话进行更新:
澄清一下,我不希望它输出function anonymous() function anonymous()
。我想让它输出function anonymous(x, y) function anonymous(x, y, z)
。
Chrome v43不支持Windows 8.1, Windows 7或Mac OS X 10。
firefox39无法工作
Chrome金丝雀v45工作完美。另一个用户说v44也可以
我希望有跨浏览器兼容性,如果可能的话
我是这个代码的作者
如果你认为我的代码写得很奇怪,你显然没有读过整个问题。
Chrome、Opera、Safari和Edge的现代版本名义上可以运行。
Firefox仍然记录不带参数的函数,但由于它现在在所有三个版本的代码中都统一这样做,因此似乎已经解决了这个错误。我认为这种显示选择是开发人员有意识的选择。
如果能看到Mozilla关于这个问题的进一步文档就更好了,如果Firefox能通过正确显示函数参数来加入Chrome、Opera、Safari和Edge,那就更好了。