自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于 JavaScript 的 with 語句

開發(fā) 前端
With 語句可以對某個對象執(zhí)行一系列的語句,而不用重復(fù)指出對象的名稱。本文介紹的是JavaScript中的with 語句,一起來看。

JavaScript 有個 with 關(guān)鍵字, with 語句的原本用意是為逐級的對象訪問提供命名空間式的速寫方式. 也就是在指定的代碼區(qū)域, 直接通過節(jié)點(diǎn)名稱調(diào)用對象.

用過 Java 和 .NET 的同學(xué)對包或命名空間的概念應(yīng)該不會陌生, 正因?yàn)橛羞@個概念, 使代碼的簡潔易讀得到了保證. 不知 JavaScript 設(shè)計(jì)之初是如何定位 with 語句的, 個人覺得它們之間有一定的相似度. 如:

  1. apple.banana.candy.dog.egg.fog.god.huh.index = 0;  
  2. doSomething(apple.banana.candy.dog.egg.fog.god.huh.index);  

利用 with 語句, 可以寫為以下代碼.

  1. with(apple.banana.candy.dog.egg.fog.god.huh)   
  2. {  
  3. c = 0;  
  4. doSomething(index);  
  5. }  

看起來很美妙, 卻存在致命的缺陷. 下面我們來進(jìn)行一些小測試吧.

1. 在 with 語句內(nèi)部通過內(nèi)部變量修改數(shù)值

  1. var root = {  
  2. branch: {  
  3. node: 1  
  4. }  
  5. };  
  6. with(root.branch) {  
  7. node = 0;  
  8. // 顯示 0, 正確!  
  9. alert(node);  
  10. }  
  11. // 顯示 0, 正確!  
  12. alert(root.branch.node);  

2. 在 with 語句內(nèi)部通過對象節(jié)點(diǎn)修改數(shù)值

  1. var root = {  
  2. branch: {  
  3. node: 1  
  4. }  
  5. };  
  6. with(root.branch) {  
  7. root.branch.node = 0;  
  8. // 顯示 0, 正確!  
  9. alert(node);  
  10. }  
  11. // 顯示 0, 正確!  
  12. alert(root.branch.node);  

經(jīng)過測試 1 和測試 2, 乍看沒什么問題, 但是... 請看測試 3.

3. 在 with 語句內(nèi)部通過對象父節(jié)點(diǎn)修改數(shù)值

  1. var root = {  
  2. branch: {  
  3. node: 1  
  4. }  
  5. };  
  6. with(root.branch) {  
  7. root.branch = {  
  8. node: 0  
  9. };  
  10. // 顯示 1, 錯誤!  
  11. alert(node);  
  12. }  
  13. // 顯示 0, 正確!  
  14. alert(root.branch.node);  

由上面的測試 3 可知, with 語句內(nèi)部的節(jié)點(diǎn)父節(jié)點(diǎn)修改后, 不會同步到節(jié)點(diǎn)本身. 也就是說, 不能保證內(nèi)外數(shù)值的一致性. 這是可能成為項(xiàng)目里面隱藏性很高的 bug.

那我們該怎么辦呢? 接受那很長的一串逐級訪問, 還是另有他法?

方法是有的. 我們可以通過別名引用父節(jié)點(diǎn)的方式來調(diào)用節(jié)點(diǎn)對象, 如:

  1. var root = {  
  2. branch: {  
  3. node: 1  
  4. }  
  5. };  
  6. var quote = root.branch;  
  7. quote.node = 0;  
  8. // 顯示 0, 正確!  
  9. alert(root.branch.node);  

我相信很少人會用 with 語句, 也不會有很多人知道這個關(guān)鍵字, 但我覺得這是個有問題的語句, 壓根就不應(yīng)該使用, 所以寫個小文記錄一下.

原文地址:http://www.neoease.com/javascript-with-statement/

【編輯推薦】

  1. Web移動應(yīng)用 HTML5 CSS和JavaScript
  2. JavaScript 假如default不是switch的***一項(xiàng)
  3. Javascript中閉包的作用域鏈
  4. 讓瀏覽器非阻塞加載javascript的幾種方式
  5. JavaScript實(shí)現(xiàn)二級聯(lián)動下拉框
責(zé)任編輯:于鐵 來源: mg12's Blog
相關(guān)推薦

2011-05-26 13:26:42

if

2010-05-26 14:41:38

JavaScript

2016-09-14 09:20:05

JavaScript閉包Web

2017-04-06 14:10:08

JavaScript數(shù)組排序

2022-07-06 05:59:40

數(shù)據(jù)庫mysql

2023-04-10 16:09:58

2024-07-18 10:12:04

2021-06-09 10:45:12

JavaScript開發(fā) 編程

2009-06-17 16:01:28

2009-07-31 14:47:22

JavaScript函C#

2016-03-21 09:26:04

JavaScript技術(shù)棧展望

2022-11-16 14:23:37

JavaScript參數(shù)屬性

2020-10-14 08:04:28

JavaScrip

2022-07-04 08:51:43

條件語句JavaScript

2011-08-29 17:13:03

外連接不等值連接等值連接

2009-06-10 22:03:40

JavaScript內(nèi)IE內(nèi)存泄漏

2022-05-08 19:58:10

JSONPJavaScript

2020-07-01 08:37:31

JavaScript開發(fā)技術(shù)

2009-11-30 14:52:01

華為路由器配置

2009-12-16 10:14:03

路由器端口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號