zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Asp.net 中 listbox 滚动条 定位 火麒
    Silverlight跨域访问WCF服务 火麒
    网页加载速度优化技巧
    很漂亮的login
    ireport
    方法1,定位,相当于四周受力
    方法2,平移
    大端小端数据存储方式
    c++中RTTI
    C语言细节数组a+1和&a+1
  • 原文地址:https://www.cnblogs.com/yuan-shuai/p/3176324.html
Copyright © 2011-2022 走看看