recursal/MDN huggingface dataset:
DoS 攻擊
======

DoS (拒絕服務)是一種網路攻擊手段，它通過大量的伺服器請求來阻止合法使用伺服器(server)資源。

計算機的資源有限，例如計算能力或内存。當這些資源過載，程式可能會凍結或崩潰，導致程式不可用。DoS 攻擊由耗盡資源、使伺服器或網路對合法用戶不可用、使服務器執行緩慢等多種技術組成。

### DoS 攻擊的類型

DoS 攻擊更多的是一種類別而不是具體的某種方式的攻擊。如下是 DoS 攻擊類型的不完全列表：

* 帶寬攻擊
* 服務請求汎濫
* SYN 汎濫攻擊
* ICMP 汎濫攻擊
* 點到點攻擊
* 永久 DoS 攻擊
* 應用級別汎濫攻擊
了解更多
----

* 維基百科上的 拒絕服務攻擊
* 在 OWASP 上的拒絕服務攻擊
* DDoS (en-US)
識別字
===

字符中的代碼序列定義了變數(**variable (en-US))、函式(function (en-US)) 或屬性(property)。**

在 JavaScript 中， 識別字衹能包含字母數字字符 (或 "$" 或 "\_")，并不能以數字開頭。識別字不同於字符串，字符串是數據而識別字是代碼的一部分。在 JavaScript 中，沒有辦法把識別字轉換為字符串，但有時候可能把字符串解析為識別碼。

了解更多
----

### 基礎知識

* 維基百科上的 識別字
Canvas
======

一個 HTML *`<canvas>`* 元素提供一個空的圖區使特定的 JavaScript APIs 可以在上面繪圖(像是 Canvas 2D 或 WebGL).

了解更多
----

### 常規知識

* Canvas 維基百科
### 學習資源

* The Canvas tutorial on MDN
### 技術參考

* The HTML `<canvas>` element on MDN
* The Canvas general documentation on MDN
* `CanvasRenderingContext2D` (en-US): The canvas 2D drawing API
* The Canvas 2D API specification
建構子
===

建構子（**constructor**）屬於實做（instantiated）的指定 class object。建構子概念可應用到大多數的物件導向程式語言。基本上，JavaScript 建構子用於在 class 的實做（instance）聲明。

語法
--


```js
// 這是個通用的建構子 class Default
function Default() {
}

// 這是擁有幾個參數的過載建構子 class Overloaded
function Overloaded(arg1, arg2, ...,argN){
}
```


要呼叫 JavaScript 內的建構子 class ，請用 `new` 操作符給 variable (en-US) 宣告新的 object reference (en-US)。


```js
function Default() {}

// 新的 Default 物件參照被分派給局部變數 defaultReference
var defaultReference = new Default();
```

深入理解
----

### 基本知識

* 維基百科的 構造器
### 技術資訊

* MDN 的 JavaScript 物件導向介紹
* MDN 的 JavaScript 的 new 操作符
屬性
==

根據所屬情境的不同，「屬性(**Property**)」可代表不同的意思。可能是：

Property (JavaScript)
**property**（屬性）是典型的物件特徵，經常與資料結構聯結。屬性分為兩種類型：
Immutable
=========

我們在說一個不可變的物件，意思就是這樣的物件內容部會被改變。

在多數情況下會要使物件成為 immutable，例如:

* 改善效能(即不打算在之後對物件做修改)
* 降低記憶體使用量(使用object reference (en-US)而非複製整個物件)
* 執行緒安全(多個執行緒都關連到相同物件且不會影響到彼此)
了解更多
----

### 基本知識

* Wikipedia 上的不可變物件
Reflow
======

\*\*Reflow（回流）\*\*會發生於瀏覽器（browser）必須再次處理和繪製部分或整個網頁時，如在互動式網站更新後。

深入了解
----

* Google article "Minimizing browser reflow"
CORS
====

**CORS**（跨來源資源共享）是瀏覽器技術規範，用來傳輸 HTTP 標頭 (en-US)，判斷阻擋或允許不同來源網域的資源存取。

同源安全政策（same-origin security policy），預設會禁止跨網域的資源請求。CORS 賦予網站伺服器跨網域存取控制能力，使其能安全地跨網域傳輸資料。

了解更多
----

### 一般知識

* MDN 上的 HTTP 存取控制（CORS）
* 維基百科上的 Cross-origin resource sharing
### CORS 標頭

`Access-Control-Allow-Origin` (en-US)

表示回傳資料能否共享（布林值）。

`Access-Control-Allow-Credentials` (en-US)

指定為 `true` 時，瀏覽器可以傳送或接收敏感資訊（HTTP Cookie）。

`Access-Control-Allow-Headers` (en-US)

指定可以出現在真實請求的 HTTP 標頭，用來回應預檢請求。

`Access-Control-Allow-Methods` (en-US)

指定存取資源所允許的 HTTP 方法，用來回應預檢請求。

`Access-Control-Expose-Headers` (en-US)

表示瀏覽器允許存取的標頭白名單，例如 `X-My-Header, X-My-Custom-Header`。

`Access-Control-Max-Age` (en-US)

表示預檢請求的回傳結果可以被快取多久（秒）。

`Access-Control-Request-Headers` (en-US)

用於預檢請求，讓伺服器知道後續真實請求夾帶的 HTTP 標頭。

`Access-Control-Request-Method` (en-US)

用於預檢請求，讓伺服器端知道後續真實請求使用的 HTTP 方法。

`Origin` (en-US)

告訴伺服器請求來源之網域。

### 技術參考

* Fetch specification
SVG
===

**可縮放向量圖形**（*Scalable Vector Graphics, SVG*）是基於 XML (en-US) 語法的 2D 向量圖片格式。

W3C 在 1990 晚期啟動 SVG 開發，但它要在 IE (en-US) 9 開始支援 SVG 後才開始發跡。目前所有主流瀏覽器都支援 SVG。

由於 SVG 基於 XML (en-US) 語法，所以它可以透過 CSS 樣式化、並透過 JavaScript 互動。HTML5 目前能在 HTML 檔案內直接嵌入 SVG 標籤 (en-US)。

由於 SVG 是向量圖形，它因此可以無限縮放。也由於你可以建立介面元素（interface element）還有在任何螢幕尺寸縮放的圖形，它在響應式設計 (en-US)上也相當重要。SVG 也提供一組有用的工具，例如剪輯、遮罩、濾器、動畫（clipping, masking, filters, animation）。

深入理解
----

### 基本知識

* 維基百科的 SVG
### 理解 SVG

* W3.org 的 SVG Primer
### 技術資訊

* MDN 的 SVG 文件
* 最新的 SVG 規範
HTTP
====

超文字傳輸協定（HyperText Transfer Protocol、HTTP）是能在全球資訊網 (en-US)發起文件傳輸的基本協定。HTTP 屬於文本性（所有交流都透過純文字完成）及無狀態（所有交流都不會記得上一次的交流）的。

深入了解
----

* MDN 的 HTTP
* 維基百科的 HTTP
Apple Safari
============

Safari 是一個來自蘋果開發的網頁瀏覽器(Web browser)同時被捆綁發行在 Mac OS X 和 IOS 平臺。它是基於開源的 WebKit 引擎.

了解更多
----

### 基礎知識

* 維基百科上的 Safari
* Safari on apple.com
### 技術資訊

* WebKit 的項目
* WebKit 每晚構建
* 向 Safari 報告 bug
參數
==

參數 (parameter) 是個會傳進函式 (function (en-US)) 的已命名變量，用來把引數 ((arguments)) 導入到函式中。

要特別注意參數和引數的差異：

* 函式參數的名稱會在函式的定義區裡面條列出來。
* 裡面的引數都是實值，會導入函式中。
* 參數一開始的值就跟有提供的引數值一模一樣。

一般而言，參數的形式有兩種表示方式：

輸入用的參數

像這樣藉由值呼叫的形式最常見。此外，還可以根據不同的程式語言，讓輸入用參數的使用模式多樣，例如：用值呼叫 (call-by-value)、用位置呼叫 (call-by-address) 和完成函式程序後把它的值設定成回傳值 (也就是 call-by-reference)。

輸出和回傳 (return) 用的函數

在函式的程序完成之後，會負責回傳多重的量值。不過，這方式可能會讓程式開發者誤解它的意思，所以不建議使用。

想了解更多嗎？
-------

### 一般常識篇

* Difference between *parameter* and *argument* on Wikipedia
### 技術參考

* Function declaration (en-US)
* Function expression (en-US)
SQL 注入
======

\*\*SQL 注入（SQL injection）\*\*利用了網路程式（Web apps）的錯誤輸入。駭客可以透過執行後端資料庫的網路程式，惡意繞過 SQL 指令。

SQL 注入能在未授權的情況下，直接從資料庫訪問資料庫與檢索信息。許多數據洩露肇因於 SQL 注入。

![](/zh-TW/docs/Glossary/SQL_Injection/sql_inj_xss.gif)

如何做動
----

![](/zh-TW/docs/Glossary/SQL_Injection/updates_loginscreen.png)

在輸入 username （用戶名）與 password （密碼）後，GUI 背後的 SQL 查詢會這樣工作：


```sql
"SELECT Count(\*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";
```


假設用戶在 username 欄位輸入了 admin 還在 password 欄位輸入了 passwd123，接著按了下面的 Log in（登入）， SQL 查詢會這樣運作：


```sql
"SELECT Count(\*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";
```


如果驗證正確，用戶就可以登入，是個很簡單（所以很不安全）的機制。駭客利用者這種不安全，獲取未經授權的訪問。

駭客使用一種稱為 Magical String 的簡單字串，例如：

**Username: *admin***

**Password: *anything 'or'1'='1***

在按下 login 按鈕以後，SQL 查詢會這樣運作：


```sql
"SELECT Count(\*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
```


仔細檢查一下查詢密碼的部分。


```sql
Password=' anything 'or'1'='1 '
```


密碼不是 anything，因此 password=anything 會回傳 FALSE（錯誤）。但 '1'='1' 是正確的宣告，所以會回傳 TRUE（正確）。最後，透過 OR （或）運算符，FALSE OR TRUE 的比較結果是 TRUE，認證因而成功通過。只要一點簡單的字串（Magical String）整個資料庫就會被洩漏。

如何避免
----

在執行用戶的憑證查詢前，先做如下的改變：


```sql
$id = $_GET['id']

(1) $id = Stripslashes($id)

(2) $id = mysql_real_escape_String($id)
```


藉由 (1) 所有輸入字串的單引號 ' 取代成雙引號 "，還有 (2) 在每個 ' 之前加上 /。 修正後的 Magical String 不能繞過驗證，並使你的資料庫保持安全。

了解詳情
----

### 基本知識

* 維基百科的 SQL 資料隱碼攻擊
* OWASP (Open Web Application Security Project) 解釋 SQL 注入
開發者工具
=====

開發者工具 (或"開發工具"或簡稱 "DevTools")是程式准許開發者執行創建、測試和 debug 的軟體。

現在的瀏覽器都提供了完整的開發者工具，它被准許用來檢查網站。它們讓用戶檢查和 debug 頁面上的 HTML, CSS 和 JavaScript准許檢查引起的網路流量，并使測量性能成爲更多，以及其他。

了解更多
----

### 基礎知識

* 維基百科上的Web development tools
### 技術參考

* MDN 上的火狐開發者工具
* Firebug (Firefox 的前開發者工具)
* 在 chrome.com 上的 Chrome DevTools
* 在 apple.com 上的Safari Web Inspector
* 在 microsoft.com 的 Edge Dev Tools
IIFE
====

**IIFE** (Immediately Invoked Function Expression) 是一個定義完馬上就執行的 JavaScript function (en-US)。

他又稱為 Self-Executing Anonymous Function (en-US)，也是一種常見的設計模式，包含兩個主要部分：第一個部分是使用`Grouping Operator` (en-US) `()` 包起來的 anonymous function。這樣的寫法可以避免裡面的變數污染到 global scope。

第二個部分是馬上執行 function 的 expression `()`，JavaScript 引擎看到它就會立刻轉譯該 function。

Examples
--------

Function 轉換為 expression 形式，並且馬上執行，function scope 內的變數在外面是無法存取的。


```js
(function () {
  var aName = "Barry";
})();
// Variable name is not accessible from the outside scope
aName; // throws "Uncaught ReferenceError: aName is not defined"
```


把 IIFE 只配給變數會儲存它的結果，而非 function 本身


```js
var result = (function () {
  var name = "Barry";
  return name;
})();
// Immediately creates the output:
result; // "Barry"
```

### 其它形式

符合 JSLint 的版本，行為一樣，只有語意略有差異：


```js
(function () {
  var aName = "Barry";
})();
```


Arrow function 版本，程式碼更為精簡，行為一致：


```js
(() => {
  var aName = "Barry";
})();
```


Async function 版本，目前主要為了 top level await 而使用：


```js
(async function () {
  var aName = "Barry";
})();

(async () => {
  var aName = "Barry";
})();
```

更多資訊
----

### 學習它

* Quick example (在 "Functions" 部分的最後面, "Custom objects" 的正前面)
### 基本知識

* IIFE 維基百科
閉包
==

定義可執行範圍(\*\*scope (en-US))\*\*的綁定：在 JavaScript, \*\*functions (en-US)\*\*會創建一個閉包上下文。

了解更多
----

### 基礎知識

* 維基百科上的 Closure
### 技術參考

* MDN 上的閉包
通訊協定
====

**通訊協定**是一套定義在電腦內部或兩台電腦間，如何交換資料的系統化規則。不同的裝置若需進行溝通，就需要先確認好要交換的資料格式與交換方法，而這些定義好的格式與方法就是通訊協定。

了解更多
----

### 一般知識

* 維基百科上的 Communications protocol 條目
* RFC 官方網路通訊協定標準
Engine
======

JavaScript 引擎是解析和執行 JavaScript 程式的翻譯員。

了解更多
----

### 基礎知識

* 維基百科上的JavaScript engine
物件
==

物件 (en-US)（Object）是一個包含資料與處理資料指令的資料結構。物件有時是指真實世界的東西，像是賽車遊戲的車子 `car` 或地圖 `map` 物件。JavaScript、Java、C++、Python、Ruby 都是 物件導向程式設計 的語言例子。

了解更多
----

### 基本知識

* 維基百科上的物件導向程式設計
* JavaScript 參考文件裡的`Object` (en-US)
* Object data structures in JavaScript
POP3
====

**POP3** (郵局協定)是一種常見協定(protocol) 用於從伺服器接收郵件通過 TCP (en-US) 鏈接.不同於IMAP4 (en-US), 由於 POP3 結構更爲複雜，更難以實施，POP3 不支持多資料夾。

客戶端通常會從伺服器取回所有的訊息然後刪除伺服器上的訊息，但是 POP3 允許伺服器保留副本。目前幾乎所有的郵件伺服器和客戶端都支持 POP3.

了解更多
----

* RFC 1939 (POP3 的規範)
* RFC 2449 (POP3 的規範擴展機制)
* RFC 1734 (POP3 的規範認證機制)
* IMAP4 (en-US)
* 維基百科上的POP
Accessibility
=============

網頁*無障礙化* (**A11Y**) 指的是儘管有物理和技術上的限制，能夠保持網站可用最佳的方法。網頁無障礙化是透過Web Accessibility Initiative (en-US) (WAI)在W3C被正式定義和討論的。

了解更多
----

### 基本知識

* 資源在 MDN
* 維基百科上的Web accessibility
### 學習網頁無障礙化

* Web Accessibility In Mind
### 技術參考

* The ARIA documentation on MDN (en-US)
* The Web Accessibility Initiative homepage
* The WAI-ARIA recommendation
Python
======

**Python**是高階通用（general-purpose）程式語言。他使用了多型編程範式（multi-paradigm approach），這意味著他支援了程序化、物件導向、還有一些函式語言程式設計結構體（functional programming constructs）。

它是由吉多·范羅蘇姆（Guido van Rossum）作為 1985 到 1990 之間盛行的 ABC 語言繼承者形象而誕生的。目前各大領域都有使用 Python：例如 Web 開發、桌面程式、資料科學、DevOps、自動化或生產力用途等。

Python 是在 OSI 認可的開源許可證規範下開發的，使其能自由使用與分發，即使是商用亦然。目前 Python 許可證是由 Python Software Foundation 管理的。

參見
--

* 維基百科的 Python
* Python 官方教學文件
* Tutorialspoint Python 教學
* AlphaCodingSkills Python 教學
* MDN 的 Django 網站框架 (Python)
* MDN 術語表
    + Java
    + JavaScript
    + PHP
    + Python
    + Ruby
MathML
======

**MathML** (一種 XML (en-US) 應用程式)是一種在網頁上表示數學表達式的開放標準。在 1998 年 W3C 第一次在瀏覽器(browser)推薦了 MathML 表示數學表達式。MathML 還有其他應用程式，它包括了科學内容和聲音合成。

了解更多
----

### 基礎知識

* 維基百科上的 MathML
### 技術參考

* What is MathML
Continuous Media
================

CSS 可以用在許多不同的地方，印刷媒體便是一種。有些排版用的 CSS 會因為所處環境的不同而有不一樣的效果。

連續性媒體 (continuous media) 指的就是這樣一種環境，其中的內容不是以片段呈現，而是持續更迭。比方說顯示在螢幕上的網頁內容、語音內容都是連續性媒體。
首次輸入延遲
======

**首次輸入延遲** (First input delay, FID) 測量從使用者第一次與你的網站互動（例如當他們點選連結、按鈕或是使用自訂的 JavaScript 控制），瀏覽器實際上能夠回應此次互動的時間點。它是個在首次使用者於網頁互動以及瀏覽器回應此互動的時間長度 (以毫秒為單位)。捲動與縮放行為都不包含在這個指標。

這個時間介於內容已經在頁面繪製完成 (FCP) 以及所有功能都能夠回應使用者的互動時間。通常取決於 JavaScript 需要在主執行緒下載、剖析、以及執行，而且在缺乏裝置速度 (考慮低階行動裝置) 的情況。延遲時間越長，使用者體驗越差。縮短網站初始化時間以及預估 long tasks (en-US) 有助於預估首次輸入延遲。

也可以看看
-----

* requestIdleCallback (en-US)
* lazy loading (en-US)
一級函式（First-class Function）
==========================

當函式在那個語言中可以被視為跟其他的變數一樣時，我們稱那樣的程式語言擁有**一級函式**。例如，函式可以作為參數傳遞到另一個函式，可以被另一個函式作為回傳值且可以被當作值一樣指派到另一個變數。

範例 | 指定函式到一個變數
--------------

### JavaScript


```js
const foo = function () {
  console.log("foobar");
};
// Invoke it using the variable
foo();
```


我們指派一個匿名函式 到 `變數` 中，然後在這個變數後面加上括弧 `()` 的方式來調用那個函式。

**備註：** 即使你已經為函式命名了，你仍然可以透過這個變數的名稱來調用它。有命名的函數在你除錯時是有幫助的。*但是這並不會影響我們調用它的方式*。

範例 | 將函式作為參數來傳遞
---------------

### JavaScript


```js
function sayHello() {
  return "Hello, ";
}
function greeting(helloMessage, name) {
  console.log(helloMessage() + name);
}
// Pass `sayHello` as an argument to `greeting` function
greeting(sayHello, "JavaScript!");
```


我們將 `sayHello()` 函式當成是變數傳遞到 `greeting()` 函式，這說明了我們將函式視為是一個值來使用它。

**備註：** 將函式作為參數傳遞到另一個函式時，被當作參數傳遞的那個函式我們稱之為回調函式 **Callback function**。*`sayHello` 就是一個回調函式。*

範例 | 回傳一個函式
-----------

### JavaScript


```js
function sayHello() {
  return function () {
    console.log("Hello!");
  };
}
```


在這個例子中，我們需要從另一個函式中回傳函式回來 - *在 JavaScript 中，我們可以回傳函式是因為我們將函式當成是一個 `值` 。*

**備註：** 當一個函式可以回傳一個函式時，稱之為高階函式 (**Higher-Order Function** )。

回到剛才的例子，現在我們需要調用 `sayHello` 函式與它所回傳的匿名函式 (`Anonymous Function`)。為了達成這個目標，我們有兩種方式：

### 1- 使用變數


```js
const sayHello = function () {
  return function () {
    console.log("Hello!");
  };
};
const myFunc = sayHello();
myFunc();
```


這樣做的話，它會回傳 `Hello!` 這個訊息。

**備註：** 如果你直接調用 `sayHello` 的話，你必須再使用另一個變數來儲存之後再調用它，調用 `sayHello` 只會回傳函式回來而**非調用它所回傳的函式**。

### 2- 使用雙括號


```js
function sayHello() {
  return function () {
    console.log("Hello!");
  };
}
sayHello()();
```


我們也可使用雙括號 `()()` 來調用所回傳的函數。

Learn more
----------

### General knowledge

* First-class functions on Wikipedia
XHTML
=====

**XHTML** 對 XML (en-US) 而言是什麼，就如同 HTML 對 SGML 而言是什麼。也就是說，XHTML 是一種類似於 HTML 的標記語言，但是有更嚴格的語法。W3C 已完成兩種 XHTML 版本︰

* XHTML 1.0 就是把 HTML4 重新整理為 XML 的應用，並在有限的情況下向後相容於 HTML。
* XHTML 1.1 就是 XHTML 的模組化版本，已不再向後相容於 HTML。

第三個版本，XHTML 2，對於元素詞彙有非常重大的改變，目前仍在開發中。

關於 XHTML 的更多資訊，請見︰

* Wikipedia 的 XHTML 條目
* Sending XHTML as text/html considered harmful
### 工具

* Markup validation service (W3C)
* Standards-Compliant Authoring Tools
### 參閱

* HTML
* Namespace (en-US)
AJAX
====

AJAX（Asynchronous JavaScript And XML (en-US)、非同步 JavaScript 與 XML）是結合了 HTML、CSS、JavaScript、DOM、還有 `XMLHttpRequest` object，以建立更複雜的網頁程式實做。AJAX 可以允許網頁只更新需要的部分，而無須重新載入整個頁面。另外，AJAX 也能讓你非同步工作，意思是說程式碼能在網頁試圖重新載入時持續運行（與同步（synchronously）相對比──它會在運行的時候封鎖程式碼運作，直到網頁重新載入成功為止）。

參見
--

* `XMLHttpRequest`
* `Fetch API`
* 使用 Fetch API
* 維基百科的 AJAX
* Synchronous vs. Asynchronous Communications
抽象化
===

在computer programming領域中，抽象化可用來減少軟體系統複雜度，讓設計及使用效率提升。用簡單的APIs隱藏背後複雜的系統機制。

了解更多
----

### 一般知識

* 維基百科上的 Abstraction
字元編碼
====

字元編碼提供了一套編碼系統，使不同的電腦系統或編譯環境可以存在並處理存在於其他語言當中的特殊字元。

例如在 HTML 中，我們通常使用以下程式碼來宣告一個 UTF-8 的字元編碼:


```html
<meta charset="utf-8" />
```


這使我們可以在 HTML 檔案中使用幾乎所有人類使用的語言，並且會正常顯示。

學習更多
----

### 基本知識

* Character encoding on W3C
* Character encoding (維基百科)
區塊 (CSS)
========

在網頁上一個**區塊**是一個HTML元素(element)它會出現一個新的行，例：在前面的元素之下和後面的元素之前(通常稱爲塊級元素)。擧個例子, `<p>` (en-US) 標簽就是一個默認的塊級元素，而 `<a>` (en-US) 標簽則是一個内聯元素— 你可以在 HTML 源代碼放一些相鄰的鏈接，他們將會并列渲染在相同的行。

使用 `display` (en-US) 屬性你可以隨意改變大多數元素的顯示方式，不論是内聯還是區塊(其中還有很多其他的選項); **blocks** 也同樣會受到定位方案和`position` (en-US)屬性的影響。

了解更多
----

### 基礎知識

* 視覺格式模型 (en-US)
Property (JavaScript)
=====================

**property**（屬性）是典型的物件特徵，經常與資料結構聯結。屬性分為兩種類型：

* *實體屬性（Instance properties）*：保存的資料只於特定的物件實體中。
* *靜態屬性（Static Properties）*：保存的資料為所有該型別物件所共有。

屬性擁有一個名字（為字串 (en-US)）以及值（可以是基本資料型別 (en-US)、方法 (en-US)或是物件參考 (en-US)）。請注意，當我們說「一個屬性保存著物件」，其實是指「一個屬性保存著物件的*參考（reference）*」。這其中的差別在於，當你改變屬性中的值的時候，所指向的物件實體之值也會改變。

了解詳情
----

### 基本知識

* 維基百科的屬性（編程）
* JavaScript 物件導向介紹
nop
===

**`nop`** 源於 no-operation（沒有任何操作），顧名思義，它不會執行任何動作。

嘗試一下
----

語法
--


```wasm
nop
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `nop` | `0x01` |
unreachable
===========

**`unreachable`** 用來表示程式不應該執行到此段。

`unreachable` 是一個無條件的例外錯誤。當程式執行到 `unreachable` 時會強制停止。

嘗試一下
----

語法
--


```wasm
unreachable
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `unreachable` | `0x00` |
end
===

**`end`** 用來結束 `block`、`loop`、`if` 或是 `else`。

我們其他 S-表達式範例都不是一定要加上 `end`，所以你在那些範例中不會看到它。然而，因為瀏覽器的開發工具裡會將 `end` 標示出來，所以知道它對你還是有幫助的。

嘗試一下
----

語法
--


```wasm
i32.const 0
if
  ;; do something
end
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `end` | `0x0b` |
if...else
=========

**`if`** 用來處理條件式。如果在記憶體堆疊中的最後一個值為 true (1)，就會執行陳述式裡的程式；如果為 false (0)，則執行其他陳述式。

嘗試一下
----

語法
--


```wasm
i32.const 0
(if
  (then
    ;; do something
  )
  (else
    ;; do something else
  )
)
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `if` | `0x04` |
| `else` | `0x05` |
block
=====

**`block`** 用來創建一個區塊標籤，事後可以用 `br` 讓程式跳出該區塊標籤。

**`loop`** 和 `block` 相似卻相反，在 `loop` 中，在一輪循環結束或是使用 `br` 跳出時，程式會回到循環的開頭；而 `block` 則是會結束該區塊標籤的執行，跳到下一段程式碼。

嘗試一下
----

語法
--


```wasm
;; label the block so that it can be branched to.
(block $my\_block
  ;; branch to the block.
  ;; most of the time you'll want to put this in an if statement and only branch on condition,
  ;; otherwise the following control flow are unreachable.
  br $my\_block
  ;; this will never be reached, since the br jumped out of the block already.
  unreachable
)
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `block` | `0x02` |
return
======

**`return`** 用來處理函數的回傳。

* 如果記憶體堆疊中沒有記錄任何東西，函數不會回傳任何東西，或是回傳 void。
* 如果記憶體堆疊中的值的類型、數量與函數指定的相同，則回傳該值。
* 如果記憶體堆疊中有多個與函數指定類型相同值，則回傳最後 N 個值，其餘捨棄。
嘗試一下
----

語法
--


```wasm
f32.const 4.3
return
```



```wasm
i32.const 7
f32.const 4.3
return
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `return` | `0x0f` |
Drop
====

**`drop`** 會取出記憶體堆疊的第一個值並將之清除。

嘗試一下
----

Syntax
------


```wasm
;; 在記憶體堆疊中加入多個值
i32.const 1
i32.const 2
i32.const 3
;; 清除記憶體堆疊中第一個值（也就是最後加入的值）—— `3`
drop
;; 堆疊中第一個值變成 `2`
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `drop` | `0x1a` |
br
==

**`br`** 是讓程式跳躍至指定區塊（可能是 loop、block 或是 if）。
 `br` 有以下幾種變體：`br_if` 是在符合指定條件下程式才會跳躍至指定區塊；`br_table` 則是根據給予的參數不同，跳至不同區塊。

嘗試一下
----

語法
--


```wasm
;; 建立一個 loop 區塊，讓程式在之後可以跳回
(loop $my\_loop
  ;; 跳回至 loop。
  ;; 在絕大多數的情況，你會希望其在特定條件下才回到 loop ，
  ;; 否則程式就會進入無限循環。
  br $my\_loop
)
```


| 指令 | 二進制運算碼 |
| --- | --- |
| `br` | `0x0c` |
| `br_if` | `0x0d` |
| `br_table` | `0x0e` |
Firefox
=======

Firefox 是 Mozilla 基金會最受歡迎的網頁瀏覽程式，在眾多平台包含 Windows、Mac OS X、桌面版 Linux 及 Android 行動裝置上發行。 具有廣大相容性，整合最新的 Web 技術和強大的開發工具。不管你是一般使用者還是開發者，Firefox 都是你的最佳選擇。

Firefox 是一項開源專案；大多數的程式碼都是由我們廣大的社群志工們所貢獻。在這裡你將會學會如何為 Firefox 專案做出貢獻，並找到一些關於打造 Firefox 擴充套件、在 Firefox 底下使用開發者工具，以及其他任務的資訊鍊結。

學習如何打造 Firefox 的擴充套件、如何自己開發及編譯 Firefox，以及 Firefox 的內部及子項目是如何運作的。

開發者技術文件

以開發者為主的技術文件；知道各個 Firefox 版本針對網站及擴充套件新增了哪些功能。

專案文件

獲得關於 Firefox 內部及它的系統版本號更詳細的資訊，以便你可以找到一個方式來處理你的程式碼。

開發者指南

我們的開發者教學提供了一些資訊來解說如何獲得及編譯 Firefox 原始碼，如何處理你的程式碼，以及如何替專案奉獻心力。

Firefox 更新頻道
------------

Firefox 釋出被分成四個 **更新頻道**：

### Firefox 每日更新頻道

每個晚上我們會建置 Firefox 在 mozilla-central 中最新的程式碼。這些版本是為了開發者，或是那些想測試還在研發中的尖端科技的嘗鮮者而建置的。

下載 Firefox 每日版

### Firefox 開發者版本

這個 Firefox 是為了開發者量身訂製的版本。每六個禮拜，我們會將 Firefox 每日版中已經夠穩定的功能加入，並釋出新版本的 Firefox 開發者版本。 我們也會將一些為了開發者設計的額外功能加入其中，而那些功能只會在這個頻道出現

了解更多關於 Firefox 開發者版本的資訊

下載 Firefox 開發者版本

### Firefox Beta 測試版

在 Firefox 開發者版本花費六個禮拜後，我們會將那些夠穩定的功能加入並釋出新版本的 Firefox Beta 版。Firefox Beta 版是為了那些 Firefox 愛好者測試那些確定會在下個版本釋出的功能。

下載 Firefox Beta 版

### Firefox

在確認 Firefox Beta 版穩定的另外六個禮拜，我們已經準備好將新功能以最新版本 Firefox 的姿態推出給全球的使用者。

下載 Firefox
附加元件
====

附加元件允許開發者擴充並訂製 Firefox 的功能。它們使用標準的 Web 技術－－JavaScript、HTML、CSS、還有一些專門的 JavaScript API－－寫成。另外，附加元件還能：

* 更改特定網站的外觀與內容
* 訂製 Firefox 用戶介面
* 增加 Firefox 的新功能
開發附加元件
------

目前有許多開發 Firefox 附加元件的工具，但 WebExtensions 會在 2017 年末成為標準。其他的工具如傳統附加元件、免重啟附加元件、附加元件 SDK 等，屆時皆預期棄用。

深入理解 WebExtensions

如果要寫新的附加元件，推薦使用 WebExtension 撰寫。

WebExtensions 是被設計為跨瀏覽器通用的：為 Firefox 撰寫的 WebExtensions 通常只要在一點點的改變下，就能在 Chrome、Edge、Opera 運行。它們也能與多行程 Firefox 完全相容。

請參見目前在 Firefox 和其他瀏覽器所支援的 API (en-US)。我們正持續設計與導入新的 API，以回應開發者所需。

多數 WebExtensions API 也能在 Firefox for Android 運行。

與現有附加元件合併
---------

如果你正在維護過時的附加元件如 XUL overlay、bootstrapped、附加元件 SDK 等，我們建議把它移植到 WebExtension。MDN 有一些移植指引。

我們在 wiki page 上收集了一些資源以助開發者完成移植。要開始的話，請使用 Lookup Tool 來檢查你的附加元件有無受影響。

發佈附加元件
------

Addons.mozilla.org，也俗稱「AMO」，是 Mozilla 給開發者們陳列附加元件的官方網站，用戶們也可以在那邊找到所需。當你把附加元件上傳到 AMO 時，你可以參與我們的用戶和創作者社區、並找到你附加元件的擁躉們。

你不用把附加元件上傳到 AMO，但你的附加元件需要給 Mozilla 簽署。否則，用戶將無法安裝。

要找到發佈附加元件的過程概觀，請參見簽署並發布你的附加元件。

其他種類的附加元件
---------

通常，當大家在講「附加元件」時候，他們是指套件（extension）。但也有其他類型的附加元件，允許用戶訂製 Firefox。包含：

* 用戶字典能讓你在不同語言內檢查拼字。
* 語言包能讓你的 Firefox 用戶介面支援多語言。
聯絡我們
----

你可以透過以下連結取得協助、獲取附加元件的新聞、還有得到回饋。

### 附加元件論壇

使用附加元件討論論壇討論附加元件方面的開發並取得協助。

### IRC

如果你喜歡用 IRC，你可以在這裡聯繫：

* #addons（討論附加元件生態圈）
* #extdev（附加元件開發的一般交流）
* #webextensions （專門討論 WebExtensions）
Firefox 各版本技術文件
===============

這個頁面整合了 Firefox 每次釋出時的技術文件。這些文件讓你能夠清楚知道各個 Firefox 版本釋出時新增了哪些新功能及修正了哪些錯誤。

1. Firefox 2 技術文件
2. Firefox 3 技術文件
3. Firefox 61 技術變動摘要
Firefox 2 技術文件
==============

Firefox 2 的開發相關特色
-----------------

Firefox 2 有許多新的特色及功能，本文提供各項新特色的相關文章連結。

### 給網頁設計師及開發者

即時摘要

即時摘要能定期顯示網頁中的關鍵訊息。網站或其他第三方開發者都能提供即時摘要來源，而後使用者能選擇在書籤上顯示即時摘要或網頁標題。

製作即時摘要

即時摘要來源的製作教學。

即時摘要 XML 語法參考

即時摘要來源之 XML 語法參考指南。

製作 OpenSearch 搜尋模組

Firefox 2 支援 OpenSearch 搜尋模組格式。

製作 MozSearch 搜尋模組

Firefox 2 支援擴充版的 OpenSearch 格式，名為 MozSearch。但此非標準，故僅建議用於程式內部。

讓搜尋模組支援搜尋建議

讓你的 MozSearch 模組支援搜尋建議功能，此功能將於搜尋欄中以下拉選單顯示建議關鍵字。

JavaScript 1.7 新功能

Firefox 2 支援 JavaScript 1.7，包含新的 `let` 表達式、跨結構指定(destructuring assignment)、產生器 (generators)、迴圈器 (iterators) 和陣列簡約式 (array comprehensions)。

WHATWG 於用戶端儲存工作階段資料

於用戶端儲存工作階段資料技術可讓網路應用程式於用戶端儲存結構化資料。

Firefox 中的 SVG

Firefox 2 提升支援 Scalable Vector Graphics (SVG) 的程度，實作了 `<textPath>` 元素、也開始支援某些從前無法妥善處理的屬性。

控制 HTML 表單中的拼字檢查功能

Firefox 2 支援文字輸入區的即時拼字檢查，本文描述撰寫 HTML 表單元素時啟用或停用此功能的方法。

Firefox 2 的安全功能

某些與安全相關之協定的預設啟用情形，在 Firefox 2 有了更動。

### 給 XUL 與擴充套件開發者

讓擴充套件升級至 Firefox 2

描述讓現有擴充套件升級以便支援 Firefox 2 的方法。

跨連線儲存 (Session store) API

Firefox 現在支援跨連線 (Session) 儲存或復原資料。

消息來源內容存取 API

讓開發者存取、解析 RSS 或 Atom 消息來源的 API。

SAX 支援

事件驅動式的 XML 解析 API。

自網頁添加搜尋引擎

Firefox 能以 JavaScript 新增搜尋引擎模組，模組可為 OpenSearch 或 Sherlock 格式。

於 XUL 中使用拼字檢查

如何使用拼字檢查功能及怎樣取得建議拼字清單的程式碼。

新增偽造網站清單來源

Firefox 可以新增額外的詐騙網站資料來源，藉此提升偵測偽造網站的能力。

新增消息來源閱讀工具

你可以用網頁或程式新增 Firefox 的消息來源閱讀工具。

Storage

Firefox 2 新增 mozStorage 功能，為基於 sqlite 的資料庫結構。

Firefox 2 佈景主題之更動

討論現有佈景主題更新以便支援 Firefox 2 的方法。

給廣大使用者的新功能
----------

Firefox 2 提供比上個版本更簡潔的操作介面，強化的安全隱私保護，讓你上網更安全方便。

### 使用操作體驗

* **文字欄內拼字檢查** 讓你在填寫表單時更安心。
* **即時摘要 (Microsummaries)** 提供另一種書籤顯示的方式，可以用網頁上的某段文字作為書籤標題，並自動更新以監視最新動態。這對股票族、網拍狂等非常有用。
* **擴充套件管理員操作介面** 更友善。
* **搜尋引擎管理員** 讓你可以重新排列順序或移除搜尋欄中的搜尋引擎。
* **強化的分頁瀏覽** 在每個分頁上加入了關閉鈕、調整了關閉分頁後的切換行為及簡化的分頁選項。
* **自動偵測搜尋引擎** 可讓你瀏覽到提供搜尋引擎的網站時直接安裝該引擎。
* **搜尋建議** 會在你於搜尋欄中搜尋時，即時提供搜尋建議。
### 安全隱私保護

* **詐騙網站防護** 會在你瀏覽偽造網站時發出警告。
Firefox 3 技術文件
==============

### Firefox 3 網站開發須知

Web application 需要更新的地方

提供一些應用 Firefox 3 的新功能在 web applications 時可能需要注意的地方。

Online / Offline 事件

Firefox 3 支援 WHATWG 的 online/offline event，讓 applications/extensions 可以偵測目前是否有 active 的網際網路連線、目前是在線上還是斷線中。

Cross-site XMLHttpRequest

Firefox 3 支援了 W3C Access Control working draft，這讓你可以對其他網站作 XMLHttpRequests 以取得其他網站的資料，並加以管理，這讓你可以在自己建立的網站中，混入來自多個其他網站的內容。

Alternate style sheet

Firefox 3 支援 CSS object model alternate style sheet API。(見 Bug 200930)

Web-based protocol handlers

在 Firefox 3，我們可以使用 navigator.registerProtocolHandler() 的方式把 web application 註冊為 protocal handler。

使用 Canvas 來「畫」字

Firefox 3 支援用 mozilla 專用的非標準、實驗中的 API (mozXXX) 來處理 <canvas>

支援在 Canvas 使用 transform

Firefox 3 支援在 <canvas> 上使用 transform() 與 setTransform()

使用 microformat

Firefox 3 現在有 APIs 可以處理 microformat

Drag / drop 事件

Firefox 3 支援兩個新的 events，在「拖放」開始與結束的時候，可以傳給「拖放操作」的 source node。

HTML 5 的 focus 相關屬性

Firefox 3 支援 HTML 5 新增給 DOM 的兩個屬性 activeElement (en-US) 與 hasFocus (en-US)。

Offline resources on Firefox

Firefox 3 現在支援讓 web application 可以要求將 resources 存入快取，以便我們離線時可以執行 web applications。

CSS 的改善

Firefox 3 改善了對於 CSS 的支援。

DOM 的改善

Firefox 3 的 DOM implimentation 有一些新功能，其中包括：支援了 IE 對 DOM 作的某些 extensions。

Javascript 1.8 的支援

Firefox 3 現在支援 Javascript 1.8。(見 Bug 380236)

EXSLT 的支援

Firefox 3 支援了 a substantial subset of the EXSLT extensions to XSLT。

SVG 的改善

Firefox 3 大大提高了對 SVG 的支援，其中包括：支援了超過兩打的新 filters、好幾個新元素、新屬性，以及其他的改善。

Animated PNG 的支援

Firefox 3 現在支援動態 PNG 格式 (Animated PNG image format)

<a ping> 的支援

Firefox 3 現在支援用 <a ping> 去 ping URL，並且預設是 enable 的。

### 參考資料

Firefox 3 for developers

### 延伸閱讀

* Updating extensions for Firefox 3 (en-US)
* Updating web applications for Firefox 3 (en-US)
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)
Firefox 2 的安全功能
===============

本文探討 Firefox 2 與安全性相關的變動。

不夠安全的編碼方式皆預設關閉
--------------

Firefox 2 預設停用 SSLv2 及不夠安全的「export」編碼方式（金鑰長度小於 64 位元），改以 SSLv3 替代，這樣可以提高安全性。

偏好的編碼方式為 `TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA` 及 `TLS_RSA_WITH_3DES_EDE_CBC_SHA`。有些伺服器則稱為 `SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA` 及 `SSL_RSA_WITH_3DES_EDE_CBC_SHA`。

若 SSLv2 必須開啟，則可以將各項以 `security.ssl2.*` 開頭的使用偏好設定為 `true`。

新特色
---

* Firefox 2 支援 TLS 下的橢圓曲線密碼。目前限於 256、384 及 521 位元（是 521 沒錯）。
* Firefox 2 支援「TLS 伺服器名稱指示套件」（TLS server name indication extension）。「TLS 伺服器名稱指示套件」能用於在同一個網路位置（Network Address）中存在多個虛擬伺服器時建立安全連線，進一步的內容請參考「RFC 3546」。
* 當 Firefox 2 傳送一個 OCSP 請求到有效的網頁伺服器認證時，Firefox 會直接連線到該伺服器，而不會使用代理伺服器（Proxy Sever）。
開啟與關閉編碼方式
---------

透過在 URL 上打上 about:config，並且篩選 "ssl" 或 "tls"，你可以得知 Firefox 2 支援哪些加密編碼，並且開啟或關閉這些加密方式。