可読性を犠牲にしてコードサイズを減らす簡単な方法のメモ。ゴルファーな人はもっとちゃんと知ってそうだなぁ
そもそもグローバルを汚染していいならいりませんが、そうでなくても関数の仮引数に書くことで普通に消せます
(function(a){
var b;
alert(a)
})()
(function(a,b){
alert(a)
})()
本当に使いたい仮引数のあとにツラツラかけばOK
function 式を代入するときは function 宣言に変えることで短かくなります。
(function(a){
a=function(){}
})()
(function(){
function a(){}
})()
定数を前もって代入するようなケースでは var → 仮引数 と併用して代入を消せます。
(function(){
var R=Math.random,p='px'
})()
(function(R,p){
})(Math.random,'px')
何度も同じプロパティアクセスをする場合 [str] にして定数をまとめることで短かくなることがあります。
(function(d,e){
d[e]; d[e]
})(document,'documentElement')
だいたいは頭使わずに変換できます。
if(a<b){
a
}else{
b; c; d
}
a<b?a:(b,c,d)
式一つしか書けなくなるので、複数の式を書きたいときはセミコロンをカンマに変えて括弧でくくるようにします。文が含まれているとどうしよもないので諦めましょう。代入とかは式なのであんまり困らないです
条件が厳しいですが1つの function を複数の用途に使いまわすことで短くなることがあります。
(function C(a){
a?(prepare...,setTimeout(C,100)):alert('loaded')
})("foobar")
定数代入がくるかどうかで分岐しています。あとで呼びだされるほうでは外からうけとる定数を使えないので、前もって準備が全て完了するようなものじゃないとだめです。
上の例でやっていますが、関数式の関数名は単純に arguments.callee の速記になります。関数宣言のように外のスコープの変数になったりはしません。
(function C(){
alert(C===arguments.callee)
})()
C() //=> C is not defined