萬惡WITH為首之Javascript

来源:互联网 发布:unity3d真实地形制作 编辑:程序博客网 时间:2024/05/17 13:42

古語云:"萬惡淫為首"。淫者,奢者,不節制亦或勝也。在Javascript中with可不是一個好東西,很難用好,而且會引發一些難以捉摸的臭蟲。我相信,你和我有一樣的經歷,為了一個tricky bug花了大量的時間,到最後居然是...居然是一個小小的錯誤。恩,不用奇怪,with有時候就是這樣。先來介紹一下with。

用在with塊中的變數限制了其查找範圍(scope chain,具體可以參考Javascript高級編程中的文章),但如果傳入的參數正好和with所包含的變數中含有的屬性同名的話,則會發生scope 查找中斷,返回的就是被with包含的變數的屬性。不清楚?看代碼說話。

function Add(x,y) {    return x+y;}

非常簡單,傳入Add(1,2)的結果就是3。再來看看with:

var point = new Object();point.x = 0;point.y = 0;function Add(x,y) {    with(point) {        return x + y;    }}


當傳入Add(1,2)的時候結果多少?Oops,結果為0!x,y這兩個變數是point中的屬性,被複寫了,返回當然不是3。然,做一些簡單的修改再來看看。

function Add(x1,y1) {    with(point) {        return x1 + y1;    }}

point中沒有x1,y1兩個屬性,所以函數的scope chain查詢會往上層查找,也就是全局空間x1,y1。最後的結果也就是3,當寫下Add(1,2)的時候。


OK,with真是個壞傢伙,絕對不要用,不然你會被上司罵得狗血淋頭。我就這樣罵過別人。不要用with,trust me.









0 0
原创粉丝点击