window对象的属性方法名形成的命名冲突

事件原由:html

  一次开发中须要获取一个数组的长度,写下如此代码chrome

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

程序在chrome下正常运行,但到IE8下出现了问题。检查代码,发现因为粗心,在函数体内部声明变量时 掉了一个var。数组

但咱们知道,js是一种弱类型语言,即便是直接赋值给未声明变量也是能够的,并且chrome下是能够正常运行的,说明这样写也是没错的。浏览器

拿到IE开发人员工具的console里跑一下,终于知道了一二。安全

在IE6,7,8下输入函数

length  = 1;

显示:对象不支持此操做工具

为何会报这样的警告呢?spa

咱们知道直接这样声明的变量是全局变量,浏览器的全局对象是window,这里便是window.length = 1;code

window.length是什么呢?htm

其实就是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对象的方法和属性资料

好了,这是愚安我入驻园子的第一篇,但愿你们多多指教,多多照顾。

相关文章
相关标签/搜索