◆ 一時変数避けたい

例えばこんなコード
var temp = arr.pop()
if(temp){
    console.log(temp)
}

temp がないと分岐条件に使ったあとにまた使えません
pop なのでもう一度メソッド呼び出すと別の値です

仮に同じになっても関数の処理によっては時間かかってしまうので避けたいです

ES6 からはスコープが使えるので
{
const temp = arr.pop()
if(temp){
    console.log(temp)
}
}

こうすれば一時変数はスコープ外から見えなくなります
これで一時変数が関数の内側全体にあることを防げるのですが これでもネストしてるし行も増えるしちょっと面倒です

楽にできないかなー と考えていて こんなものを作ってみました
function doif(cond_fn){
    return (...args) => {
        var fn = args.pop()
        return cond_fn && typeof cond_fn === "function" && typeof fn === "function"
            && cond_fn(...args)
            && fn(...args)
    }
}

var doIfTrue = doif(e => e)

doIfTrue(arr.pop(), x => cosnole.log(x))

doif 関数は doif(条件)(値, true の場合の処理) という使い方をするものです
条件を値が true のとき と設定した doIfTrue を作って doIfTrue(value, fn) と呼び出せば value が true になれば fn が value を引数に実行されます

value のところは可変引数にできます
var val = doif((a, b, c) => a + b + c > 100)(10, 40, 60, (a, b, c) => a * b * c)
合計が 100 を超える場合は 全部を掛けた値を返します
条件を満たさないなら false です


他にも一時変数が邪魔だーって思うのが 正規表現の match
var a = "[a=b]"
var x, y
var match = a.match(/^\[(.*)\=(.*)\]$/)
if(match){
x = match[1]
y = match[2]
}


var a = "[a=b]"
var x, y
doIfTrue(a.match(/^\[(.*)\=(.*)\]$/), m => [, x, y] = m)

と書けます


カッコでネストや行を使わず書けるけど見やすいか はいまいちなところ
個人的にはけっこう好きですけどね