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