◆ スコープチェーンを window. みたいに指定したスコープに対してアクセスできるようにしてみる
使いものにならない

JavaScriptではスコープチェーンの このスコープの変数を変更・参照したい! と思ってもできないです
スコープチェーンの中で一番最初に見つかったものを扱うことになります
グローバル変数だけ window. でアクセスできるのでちょっと特殊ですが 全部の変数をこうしたいなー と思って JavaScript でできる形で無理矢理やってみます

!function(){
var scope = {}
scope.x = true
function f(a,b){
var parentScope = scope;
eval("var scope = {a:a,b:b,parentScope:parentScope}")

scope.y = 100
console.log(scope)
function ff(){
var parentScope = scope
eval("var scope = {parentScope:parentScope}")
scope.x = false
console.log(scope.x, parentScope.parentScope.x)
}
ff()
}
f(10,20)
}()

それぞれの スコープの最初(関数の最初)で scope というローカル変数を作ります
作るときに その関数への引数もそこに入れてしまいます
そして ローカル変数の宣言は scope のプロパティとして作ります
また parentScope または scope.parentScope で1つ上の階層のスコープを見えるようにしておきます

こうすることで 自分のローカルの変数は scope.x のように参照できます
2つ上の関数の変数は parentScope.parentScope.x のように参照します
同じ変数名 scope parentScope を全階層で作っているので スコープチェーンで参照はできなくなります
(上の例だと関数は function 構文で作っているので 参照できてますが統一して scope のプロパティにしたほうがいいかも)


メリットは 好きなスコープの変数にアクセスできるし 書き換えができるところです
スコープチェーンにしないので 意図しないところで同じ変数名があって 思ってたのと違う関数や変数を使ってた なんてことが減ります

デメリットめんどくさい です

すっごくムダに書くことが増えます
スコープをつくるたびに毎回書く必要があるので ちょっとした無名関数なら 本来の処理より定型文が長くなってしまいます
それに ローカル変数アクセスに毎回 scope と付ける必要まででてきます
さらに 上の階層の scope を引き継いで scope というローカル変数を作るために eval なんてちょっと特殊なことしてます

この方法で書かないと行けないなんてなったらタイヘンすぎますよね
メリットも わざわざここまでしてまで欲しいものじゃないですし

ということで スコープチェーンで好きな階層のスコープにアクセスするのは 現実的な方法じゃムリそう ということです