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

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/yuan-shuai/p/3176324.html
Copyright © 2011-2022 走看看