之前在看書時也有看到過with關鍵字,可是書上說不推薦使用,就沒有深入了解了,所以對它幾乎沒有啥印象,今天看書時又看到了,心里想著“存在即合理“,所以就深入的學習了一下。
一. with語句的作用:
with語句能夠針對對象來創建程序塊,設置代碼在特定對象中的作用域。
二. 語句的格式:
with(exPRession) statement;三. 使用with可以簡化代碼: (1)優化前的代碼:
function foo(){ var obj = { name:"luwenjing", age:22, sex:'女' }; console.info(obj.name+" "+obj.age+" "+obj.sex); } foo();(2)優化后的代碼:
function foo(){ var obj = { name:"luwenjing", age:22, sex:'女' }; with(obj){ console.info(name+" "+age+" "+sex); } } foo();當代碼中需要多次使用同一個對象時,就可以用with語句,簡化代碼。
四. 設置代碼在特定對象中的作用域:
var obj = { x:10, foo: function() { with(this){ x = 20; y = 30; console.info(y); } } } obj.foo(); //30 console.info(obj.x); //20 console.info(obj.y); //undefined在上面的代碼中,對象obj只有x和foo另個屬性,由于y屬性并不是obj的直接屬性,它是在foo函數中定義的,相當于臨時變量,調用obj.y就是undefined,只有with塊執行y才被定義賦值。
五. with的弊端: (1)性能問題:比如在上面的代碼中,obj有個x屬性,with中也出現x,js引擎會不明確x是臨時變量,還是obj的屬性,就會放棄對代碼的優化,從而影響代碼的執行效率。 (2)語義不明,容易出現bug:
function foo(obj) { with (obj) { a = 2; } } var o1 = { a: 3 }; var o2 = { b: 3 }; foo(o1); console.info(o1.a); // 2 foo(o2); console.info(a); // 2在上面的代碼中,出現的結果就和預測結果不一致,本想著打印a的結果應該是undefined的,可是卻是2,這是因為在o2中沒有a屬性,但是執行了with語句,a被修改就成了全局變量,就出錯了。
綜上:with語句在代碼中要避免使用,盡管它會簡化代碼,可是會影響執行效率,更容易出錯,所以這篇博客的作用是什么呢?告訴我在編碼中避免用with關鍵字,嗯,就是這。。。
新聞熱點
疑難解答