javascript 延長作用域鏈 與沒有塊級作用域
轉自javascript高階程式設計(第三版):
javascript的執行環境的型別共有兩種:全域性和區域性(函式)。不過可以通過別的方法來延長作用域鏈。
1)try-catch語句的catch塊
2)with語句
對於with語句來說,會將指定的物件新增到作用域的前面。也就是說,如果在區域性環境中,使用with語句,物件會新增到區域性環境中;如果在全域性環境中,使用with語句,物件會新增到全域性環境中。
with 語句是執行緩慢的程式碼塊,尤其是在已設定了屬性值時。大多數情況下,如果可能,最好避免使用它。
with使用的情況:
轉自:http://www.cnblogs.com/lidabo/archive/2011/12/29/2306126.html
有了 With 語句,在存取物件屬性和方法時就不用重複指定參考物件,在 With 語句塊中,凡是 JavaScript
不識別的屬性和方法都和該語句塊指定的物件有關。With 語句的語法格式如下所示:
With Object {
Statements
}
物件指明瞭當語句組中物件預設時的參考物件,這裡我們用較為熟悉的 Document 物件對 With 語句舉例。例如 當使用與 Document 物件有關的 write( )或 writeln( )方法時,往往使用如下形式:
document.writeln(”Hello!“)
如果需要顯示大量資料時,就會多次使用同樣的 document.writeln()語句,這時就可以像下面的程式那樣,把所有以 Document 物件為參考物件的語句放到With 語句塊中,從而達到減少語句量的目的。下面是一個With 語句使用的例子:
<html> <head> <title>JavaScript Unleashed</title> </head> <body> <script type="text/javascript"> function test(){ with(document){ write("您好 !"); write("<br>這個文件的標題是 : \"" + title + "\"."); write("<br>這個文件的 URL 是: " + URL); write("<br>現在您不用每次都寫出 document 物件的字首了 !"); } } </script> <button onclick="test()">test</button> </body> </html>
這樣,您在使用 document 的方法和屬性時就可以去掉 Document 字首。
請注意程式中的 title 和 URL 均是 Document 對 象的屬性,一般情況下應寫作document.title 和document.URL 使用 With 語句,您只需指定一次參考物件,這同把每一行都用document.writeln()列印下來的結果一樣,
對於catch語句來說,會建立一個新的變數物件,其中包含的是被丟擲的錯誤物件的宣告。在IE8及之前的javascript實現中,存在一個與標準不一樣的地方,即在catch語句中捕獲的錯誤物件會被新增到執行環境的變數物件,而不是catch語句的變數物件中。換句話說,即使是在catch塊的外部也可以訪問到錯誤物件。IE9中修復了這個問題。也就是說,在IE9以後的版本中,只能在catch的內部訪問到錯誤物件。
相關推薦
javascript 延長作用域鏈 與沒有塊級作用域
轉自javascript高階程式設計(第三版): javascript的執行環境的型別共有兩種:全域性和區域性(函式)。不過可以通過別的方法來延長作用域鏈。 1)try-catch語句的catch塊 2)with語句 對於with語句來說,會將指定的物件新增到作用域的前面
ES6裏關於作用域的拓展:塊級作用域
message div ssa col cau 也會 var 異常 true 過去,javascript缺乏塊級作用域,var聲明時的聲明提升、屬性變量等行為讓人困惑。ES6的新語法可以幫助我們更好地控制作用域。 一、var聲明 1、變量提升:var聲明會發生“變量提升
JavaScript塊級作用域與函式作用域
一、JavaScript塊級作用域 我們都知道,在ECMAScript6之前,JavaScript沒有塊級作用域。塊級作用域是由一對花括號封閉的程式碼組成,在JavaScript中也叫他們自己的執行環境(請參考我的另一篇博文JavaScript執行環境詳解),我們可以通過如
Javascript中的作用域鏈與閉包
Javascript中有兩個十分重要的概念–作用域鏈和閉包。 我是這樣理解作用域鏈的,在一個函式中,函式內部所有可以訪問的變數,排成了一個棧,想根據某個變數名訪問變數時,就從棧頂開始向下搜尋,搜到的第一個就算是找到了。那麼,這個棧是怎麼排列的呢?棧頂,是函式的內部變數
JS的作用域鏈與原型鏈
加載 obj tro 作用域鏈 繼承 exec 變量 賦值 js代碼 來一波,好記性不如爛筆頭。 這兩條鏈子可是很重要的。 作用域鏈 當執行一段JS代碼(全局代碼或函數)時,JS引擎會創建為其創建一個作用域又稱為執行上下文(Execution Context),在頁面加載後
javascript之模擬塊級作用域
es6 匿名 重新 ror 一段 put 使用 模仿 保存 在java、C++等語言中,變量i在會在for循環的語句塊中定義,循環一旦結束,變量i就會被銷毀。可是在javaScript中,從定義開始,就可以在函數內部隨處訪問。比如 function output(){
JS詳細圖解作用域鏈與閉包
function 就會 挑戰 timer 重新 http 哈哈 comment bject JS詳細圖解作用域鏈與閉包 攻克閉包難題 初學JavaScript的時候,我在學習閉包上,走了很多彎路。而這次重新回過頭來對基礎知識進行梳理,要講清楚閉包,也是一個非常大的
js內存空間 執行上下文 變量對象詳解 作用域鏈與閉包 全方位解讀this
變量 詳解 tail bsp pin 上下 AR detail net 內存空間:https://blog.csdn.net/pingfan592/article/details/55189622 執行上下文:https://blog.csdn.net/pingfan592
【JS】----作用域鏈與原型鏈
轉https://www.cnblogs.com/pssp/p/5204324.html 什麼是作用域鏈,什麼是原型鏈。 作用域是針對變數的,比如我們建立了一個函式,函式裡面又包含了一個函式,那麼現在就有三個作用域 全域性作用域==>函式1作用域==>函式2作用域 作用域的特點就是
Javascript 塊級作用域
1. ES3 塊級作用域 ES3的with語句,try__catch語句的catch子句在執行時自動建立一個塊級作用域。 var obj = { name: "obj"; } var name = "global"; function test() {
JS塊級作用域與函式作用域–ES6 let
JS塊級作用域與函式作用域–ES6 let 今天在學習ES6時看到新增了塊級作用域的概念,於是回顧一下ES5中的函式作用域加深印象 ES5沒有塊級作用域 ES5中沒有塊級作用域,只用函式作用域,來看下面一段程式碼 for (i = 0; i < 1; i++)
JavaScript不一般的塊級作用域
不一般的塊級作用域 塊級作用域 1.什麼是作用域 由於程式碼執行會形成程式碼執行的空間,這個執行空間指的就是我們的作用域。 表示式,函式執行的環境就會產生作用域,也就是變數,函式能作用到的範圍,我在這個範圍內,起作用,他就是我的作用域。 通過之前的學習,瞭解
javascript 中的立即呼叫函式模式、閉包及es6中的塊級作用域
先來看一個在牛客上看到的面試題: 這裡一開始會以為是不就是隔1秒輸出i的值嗎,最後結果就是輸出0~9 的十個數字呀,真的是太young了。 但是真是擼了一遍程式碼,控制檯輸出刺眼的10個10,what? 這個查了資料是說因為這個函式為每一個i都設定了一個計時器,那麼
【ES6】塊級作用域與函式宣告
塊級作用域與函式宣告 ES5 規定,函式只能在頂層作用域和函式作用域之中宣告,不能在塊級作用域宣告。 // 情況一 if (true) { function f() {} } // 情況二 try { function f() {} } catch(e) { // ..
JavaScript的作用域、塊級作用域(私有作用域)概念理解
任何一對花括號中的語句集都屬於一個塊,在這之中定義的所有變數在程式碼塊外都是不可見的,我們稱之為塊級作用域 作用域永遠都是任何一門程式語言中的重中之重,因為它控制著變數與引數的可見性與生命週期。講到這裡,首先理解兩個概念:塊級作用域與函式作用域。 什
塊級作用域與函式作用域
函式作用域:變數在定義的環境中以及巢狀的子函式中處處可見; 塊級作用域:變數在離開定義的塊級程式碼後立即被回收。 函式作用域 在ES6之前,js的作用域只有兩種:函式作用域和全域性作用域。使用var宣告的變數,都存在變數提升的過程。 console.lo
JavaScript閉包--模仿塊級作用域
正如閉包的定義一樣:“閉包指的是有權訪問另一個函式作用域中的變數的函式”, 閉包最大的意義就在於閉包可以對另一個函式作用域的變數進行訪問,由此,閉包可以延伸出一系列的用法。 模仿塊級作用域 JavaScript沒有塊級作用域的概念。這意味著在塊語句中定義
一道題目理解js中變數在作用域鏈與原型鏈中的查詢順序
js作用域鏈下面是一道js題目:[javascript] view plain copyfunction C1(name){ if(name){ this.name = name; } } function C2(name){
js深入(三)作用域鏈與閉包
在之前我們根絕物件的原型說過了js的原型鏈,那麼同樣的js 萬物皆物件,函式也同樣存在這麼一個鏈式的關係,就是函式的作用域鏈 作用域鏈 首先先來回顧一下之前講到的原型鏈的尋找機制,就是例項會先從本身開始找,沒有的話會一級一級的網上翻,直到頂端沒有就會報一個undefined 同樣的js的機制就是這樣的,函式
塊級作用域綁定
對象創建 數字 函數 null on() 塊級作用域 true 即使 函數表 #var聲明及變量提升機制 在 函數作用域 或 全局作用域中通過 var 聲明的變量,無論實際上在哪裏聲明的,都會被當成在 當前作用域頂部聲明的變量。這就是常說的提升機制;function