◆ Function 関数で関数を作るとグローバルで無名関数作ったような扱いになる

突然ですが レキシカルスコープじゃなくて外のスコープ見えない関数を作りたいことってないですか?
外を見えること自体はいいのですが 外の物はいっさい使わないってときは外のスコープを見ないと宣言できたほうが後で見るときや他の人のコード見るときに見やすいですし バグも減ると思います

もちろん 普通に関数作ると作られたコンテキストのスコープは絶対に見ることができてしまうのですが ちょっとした裏技で見えなくすることができます
function sample(){
var val = 123
var test1 = function(){console.log('test1: ' + val)}
var test2 = Function("console.log('test2 :' + val)")
test1()
test2()
}
sample()
test1: 123
Uncaught ReferenceError: val is not defined(…)

Function 関数で定義するとグローバルスコープで無名関数を作ったような扱いになるので 関数を定義したスコープの変数は見えません
さすがにグローバルスコープは見えてしまいますが グローバルなのでむしろそれが自然かと思います

一見よさそうなのですが Function 関数の引数は文字列なので eval と同じくあまり使いたくないものです
関数の中身を文字列で書かないといけないので使い勝手も微妙ですし

function* みたいに function@ とかでできないかなー