コードのネストを無視して動的にスコープを覆い隠す方法について

以前の記事

var a = 0;
var fun = function (arg) {
    if (arg) {
        eval ("var a = 1;"); // exp.1
    }
    print ("a : " + a);
};
fun (true); // a : 1
fun (false): // a : 0

という方法を紹介しましたけど,実はこういう風にやる方が普通っぽい.わからないけど.

var a = 3;

var fun = function (arg) {
    var a = 4;
    if (arg) {
	with (window) {
	    alert (a);
	}
    } else {
	alert (a);
    }
};

alert (fun (true));// 結果 : 3
alert (fun (false));// 結果 : 4

この方が素直.

前回も書いたんだけど,これができても何の役に立つかはよくわからない.

しかも,よくよく考えると,コーディングスタイルとしても,こういう書き方は如何かと思う.

javascriptはレキシカルスコープを持つ言語なので,スコープはあくまでもネストによって解決されるべきではないか?

withのようにスコープのネストの一部をまるまるコンテキストに張り付けるのは

危険だ.

とくに,with (window)などと書くのは実効速度的にも問題があると思う.



コーディングスタイルによって危険なコードは避けることができる.

無駄な危険は極力避けるべきだ.