◆ 次でしか使わない一時変数をなくしたい
  ◆ if の条件と関数呼び出しの引数に使いたい場合など
◆ if に使うなら if で for みたいに変数宣言できればいいのに

const value = something()
if(value) {
send(value)
}

直下の 1 つでしか使わないのに value が以降も残るのが嫌な部分です

さらに これのすぐあとに something2() で同じようなことしようとすると value がすでに定義されてるという問題もあるのですよね
value2 のように一時変数を増やして連番つけるのも見やすくないですし
かと言って これのためにブロックスコープ作ると行が長くなるしインデント深くなるしで 見やすさ的に悪い方向に行ってる感じがします

なのでこういうヘルパ関数を作ってみようとしてはなんか違うなーと思います

const fn = (value, fn) => fn(value)
fn(something(), x => {
if (x) {
send(x)
}
})

fn を用意しなくても即時関数実行でできるものですし

!((x) => {
if (x) {
send(x)
}
})(something())

でもさすがにこれは見づらすぎです

結局のところ const にせず使いまわし変数を用意してこうするのが シンプルに書けて不要な関数呼び出しも避けれてパフォーマンス的にも最適なんですよね

let _
if(_ = something()) {
send(_)
}

_ は使い回すので 直下に something2 で同じような処理を書けます

ただ こういうミスしやすそうな書き方が許せない気持ちも大きいです
C# の if に is を使ったようなパターンマッチでスコープ内変数ができてくれるといいのですけど
それか for 文のように if の () 中に let や const 定義できるようにするとか

if (const value = something()) {
send(value)
}

とりあえず for にして 1 回ループするようにすれば ただブロックスコープ作るより短くなるけど やっぱりわかりづらいです

for (const value of [something()]) {
if (value) {
send(value)
}
}

メソッドであれば最近使えるようになった ?. を使うと

something()?.send()

と書けますが関数呼び出しだと使えません

その他色々考えてみても複雑になるだけでスッキリとした書き方にはならないです

const callIf = fn => value => value && fn(value)
const sendCallIf = callIf(send)
sendCallIf(something())
const when = cond => (truefn, falsefn) => value =>
cond(value) ? (truefn && truefn(value)) : (falsefn && falsefn(value))
when(e => e)(send)(something())

if で変数宣言できるのがベストなのですが 他の言語だといい方法あるのでしょうか