JavaScript的陷阱(2)

作者:秦歌 来源:随网之舞 时间:2008-10-28 19:52:00 

HTML id 冲突

JavaScript DOM绑定(JavaScript DOM bindings)允许通过HTML id索引。在JavaScript中函数和属性共享同一个名字空间。所以,当在HTML中的一个id和函数或属性有相同的名字时,你会得到难以跟踪的逻辑错误。然而这更多是一个CSS最佳实践的问题,当你不能解决你的JavaScript问题时,想起它是很重要的。

<ul><li id="length">1</li><li id="thisLength">2</li><li id="thatLength">3</li></ul><script>var listitems = document.getElementsByTagName('li');var liCount = listitems.length; var thisLength = document.getElementById('thisLength');    thatLength = document.getElementById('thatLength');            </script>

如果你要标记(X)HTML,绝不要使用JavaScript方法或属性名作为id的值。并且,当你写JavaScript时,避免使用 (X)HTML中的id值作为变量名。

变量作用域

JavaScript中的许多问题都来自于变量作用域:要么认为局部变量是全局的,要么用函数中的局部变量覆盖了全局变量。为了避免这些问题,最佳方案是根本没有任何全局变量。但是,如果你有一堆,那么你应该知道这些陷阱。

不用var关键字声明的变量是全局的。记住使用var关键字声明变量,防止变量具有全局作用域。在下面例子中,在函数中声明的变量具有全局变量,因为没有使用var关键字声明:

anonymousFuntion1 = function(){ globalvar = 'global scope'; return localvar;}();alert(globalvar); anonymousFuntion2 = function(){ var localvar = 'local scope'; return localvar;}();alert(localvar);

作为参数引进到函数的变量名是局部的。如果参数名也是一个全局变量的名字,像参数变量一样有局部作用域,这没有冲突。如果你想在函数中改变一个全局变量,这个函数有一个参数复制于这个全局变量名,记住所有全局变脸都是window对象的属性。

var myscope = "global";function showScope(myscope){ return myscope; }alert(showScope('local'));function globalScope(myscope){ myscope = window.myscope; return myscope;}alert(globalScope(’local’));

你甚至可以在循环中声明变量:

for(var i = 0; i < myarray.length; i++){}


覆盖函数/重载函数

当你不止一次的声明一个函数时,这个函数的最后一次声明将覆盖掉该函数的所有前面版本且不会抛出任何错误或警告。这不同于其他的编程语言,像Java,你能用相同的名字有多重函数,只要它们有不同的参数:调用函数重载。在JavaScript中没有重载。这使得不能在代码中使用JavaScript核心部分的名字极其重要。也要当心包含的多个JavaScript文件,像一个包含的脚本文件可能覆盖另一个脚本文件中的函数。请使用匿名函数和名字空间。

(function(){ if(!window.MYNAMESPACE) {  window['MYNAMESPACE'] = {}; } function myFunction(var1, var2){   } window['MYNAMESPACE']['myFunction'] = myFunction;})();

这个例子正式为了实现解决上一个陷阱“变量作用域”的最佳方案。匿名函数详细内容请看《Javascript的匿名函数》。YUI整个库只有YAHOO和YAHOO_config两个全局变量,它正是大量应用匿名函数和命名空间的方法来实现,具体请看《Javascript的一种模块模式》。

字符串替换

一个常见错误是假设字符串替换方法的行为会对所有可能匹配都产生影响。实际上,JavaScript字符串替换只改变了第一次发生的地方。为了替换所有发生的地方,你需要设置全局标识。同时需要记住String.replace()的第一个参数是一个正则表达式。

var myString = "this is my string";myString = myString.replace("","%20"); // "this%20is my string"myString = myString.replace(/ /,"%20"); // "this%20is my string"myString = myString.replace(/ /g,"%20"); // "this%20is%20my%20string"

parseInt

在JavaScript得到整数的最常见错误是假设parseInt返回的整数是基于10进制的。别忘记第二个参数基数,它能是从2到36之间的任何值。为了确保你不会弄错,请一直包含第二个参数。

parseInt('09/10/08'); parseInt(’09/10/08′,10);

如果parseInt没有提供第二个参数,则前缀为 ‘0x’ 的字符串被当作十六进制,前缀为 ‘0′ 的字符串被当作八进制。所有其它字符串都被当作是十进制的。如果 numString 的前缀不能解释为整数,则返回 NaN(而不是数字)。

标签:陷阱,编程,javascript
0
投稿

猜你喜欢

  • python中的反斜杠问题深入讲解

    2023-04-20 14:08:36
  • Python基于opencv实现的人脸识别(适合初学者)

    2021-10-13 19:39:29
  • 把论坛从ACCESS转成SQL版本

    2009-04-13 15:59:00
  • SQL Server开发智能提示插件SQL Prompt介绍

    2024-01-23 01:02:54
  • mysql到oracle的移植

    2011-01-29 16:23:00
  • 在PHP中读取和写入WORD文档的代码

    2023-09-28 02:30:22
  • Python中的int函数使用

    2023-05-13 06:11:59
  • 使用JS轻松实现ionic调用键盘搜索功能(超实用)

    2024-04-17 10:26:21
  • ROS  TF坐标变换基本概念及使用案例

    2022-02-01 10:25:35
  • Python3搜索及替换文件中文本的方法

    2023-08-24 04:33:44
  • django 多数据库及分库实现方式

    2024-01-14 01:13:00
  • python批量替换页眉页脚实例代码

    2022-09-09 11:02:29
  • Python设计模式中的创建型工厂模式

    2023-05-09 17:47:02
  • Python 图像处理之颜色迁移(reinhard VS welsh)

    2022-06-08 05:22:31
  • 一个asp版XMLDOM操作类

    2011-04-19 10:50:00
  • Python加pyGame实现的简单拼图游戏实例

    2021-12-20 04:31:45
  • 浅谈Go语言的error类型

    2024-05-10 13:57:58
  • Vue0.1的过滤代码如何添加到Vue2.0直接使用

    2024-05-22 10:41:57
  • pycharm激活码免费分享适用最新pycharm2020.2.3永久激活

    2021-12-11 10:17:09
  • Django框架中render_to_response()函数的使用方法

    2023-09-03 13:58:49
  • asp之家 网络编程 m.aspxhome.com