天天看點

window對象的屬性方法名造成的命名沖突

事件起因:

  一次開發中需要擷取一個數組的長度,寫下如此代碼

1 function func(arr){
2     length = arr.length;
3     ......//相關操作
4 }      

程式在chrome下正常運作,但到IE8下出現了問題。檢查代碼,發現由于粗心,在函數體内部聲明變量時 掉了一個var。

但我們知道,js是一種弱類型語言,即使是直接指派給未聲明變量也是可以的,而且chrome下是可以正常運作的,說明這樣寫也是沒錯的。

拿到IE開發人員工具的console裡跑一下,終于知道了一二。

在IE6,7,8下輸入

length  = 1;      

顯示:對象不支援此操作

為什麼會報這樣的警告呢?

我們知道直接這樣聲明的變量是全局變量,浏覽器的全局對象是window,這裡即是window.length = 1;

window.length是什麼呢?

其實就是window.frames.length,即frame的數量,對它進行指派改變,顯然很容易觸發一些問題。

不光是length,window對象的其他屬性也不能随意指派,例如:

frames = 1;      

顯示:尚未實作的警告

其他浏覽器為什麼可以呢?

打開chrome的console,輸入

length = 3;
console.log(window.frames.length);      

輸出:3,IE9+也是如此。

不僅如此,在IE8下,輸入

var length = 3;
console.log(window.frames.length);      

也是輸出3。

顯然浏覽器是允許開發者顯示的去改變内置對象window的一些屬性的

後續思考:

浏覽器開發商允許開發者可以顯示地改變這些屬性,是否會造成一些安全性問題,身為菜鳥的我不得而知,但有時确實會造成一些不必要的麻煩,比如像愚安我這次遇到的這種小問題。

是以在此提醒一下一些像我這樣的js菜鳥注意下,在使用全局變量時,盡量避開window的一些屬性名稱,以免出現很郁悶的問題,希望能或多或少給大家一點啟發。

關于window對象有哪些屬性,在此愚安我就不一一列舉了,想知道童鞋們可以移步另一篇園子裡的部落格:js-window對象的方法和屬性資料

好了,這是愚安我入駐園子的第一篇,希望大家多多指教,多多照顧。

  

作者:愚安

出處:http://www.cnblogs.com/yuan-shuai/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。