深刻js系列-環境

javascript運行環境

js若是隻在引擎中運行,它會嚴格遵循而且能夠預測的,可是js幾乎都在宿主環境中運行,瀏覽器或者Node環境javascript

ECMAScript中的Annex B

介紹了瀏覽器兼容性問題致使與官方規範的差別java

• 在非嚴格模式中容許八進制數值常量存在,如0123(即十進制的83)。
• window.escape(..) 和window.unescape(..) 讓你可以轉義(escape)和迴轉(unescape)
帶有% 分隔符的十六進制字符串。例如,window.escape( "? foo=97%&bar=3%" ) 的結果
爲"%3Ffoo%3D97%25%26bar%3D3%25"。
• String.prototype.substr 和String.prototype.substring 十分類似,除了前者的第二個
參數是結束位置索引(非自包含),後者的第二個參數是長度(須要包含的字符數)。
Web ECMAScript規範,介紹官方ECMAScript和目前瀏覽器中JavaScript實現的差別
<!-- 和--> 是合法的單行註釋分隔符。
• String.prototype 中返回HTML 格式字符串的附加方法:anchor(..)、big(..)、
blink(..)、bold(..)、fixed(..)、fontcolor(..)、fontsize(..)、italics(..)、
link(..)、small(..)、strike(..) 和sub(..)。
以上內容在實際開發中不多使用,也不推薦,咱們更傾向於使用其餘的內建
DOM API 和自定義工具集。
• RegExp 擴展:RegExp.$1 .. RegExp.$9(匹配組) 和RegExp.lastMatch/RegExp["$&"](最
近匹配)。
• Function.prototype 附加方法:Function.prototype.arguments(別名爲arguments 對象)
和Function.caller(別名爲arguments.caller)。
宿主對象 由宿主對象建立並提供給js引擎的變量,包括內建對象和函數

常見的宿主對象,以下例子web

var a = document.createElement( "div" );
typeof a; // "object"--正如所料
Object.prototype.toString.call( a ); // "[object HTMLDivElement]"
a.tagName; // "DIV"

須要注意宿主對象的行爲差別瀏覽器

• 沒法訪問正常的object 內建方法,如toString();
• 沒法寫覆蓋;
• 包含一些預約義的只讀屬性;
• 包含沒法將this 重載爲其餘對象的方法;
全局DOM變量

一個不太爲人所知的事實是:因爲瀏覽器演進的歷史遺留問題,在建立帶有id 屬性
的DOM 元素時也會建立同名的全局變量dom

<div id="foo"></div>
  if (typeof foo == "undefined") {
    oo = 42; // 永遠也不會運行
  }
console.log( foo ); // HTML元素

當頁面出現多個id同名時,咱們能夠直接使用該全局變量來獲取同id的HTMLCollectionecmascript

故意設置兩個id同名,固然編碼時不推薦,簡易保持惟一
函數

使用id做爲變量名來獲取同名DOM
工具

原生原型

不要擴展原生原型,由於隨着規範發展,擴展的功能可能會被實現,使得擴展和規範衝突優化

必要的擴展建議做以下處理this

if (!Array.prototype.push) {
// Netscape 4沒有Array.push
  Array.prototype.push = function(item){
    this[this.length-1] = item;
  };
}
shim/polyfill

polyfill 能有效地爲不符合最新規範的老版本瀏覽器填補缺失的功能,讓你可以經過可靠的代碼來支持全部你想要支持的運行環境,shim/polyfill可以填充新的API,可是無法填充新的語法,咱們可使用bable來將新的語法轉換成舊的語法

保留字

宿主環境實現的限制

下面列出一些已知的限制:

• 字符串常量中容許的最大字符數(並不是只是針對字符串值);
• 能夠做爲參數傳遞到函數中的數據大小(也稱爲棧大小,以字節爲單位);
• 函數聲明中的參數個數;
• 未經優化的調用棧(例如遞歸)的最大層數,即函數調用鏈的最大長度;
• JavaScript 程序以阻塞方式在瀏覽器中運行的最長時間(秒);
• 變量名的最大長度。
相關文章
相關標籤/搜索