Javascript 陷阱 window全局对象
function Test(){
this.name='Test';
var name=2;
this.show=function(){
alert(name);
alert(this.name);//显示名字
}
}
var test=new Test();//通过构造器创建一个对象
test.show();//输出2和'Test' ,说明对象方法访问其属性时必须加this.
function Test2(){
this.name='Test2';
this.show=function(){
alert(name);
alert(this.name);
}
}
Test();//直接调用Test();
var test2=new Test2();
test2.show();//输出了Test,Test2,很奇怪啊,name问什么有值了,而且怎么会是'Test',bug?
alert(name);
window.show(); //输出2,test;怎么会有show函数呢,难道是bug
//依次输出2,Test;Test,Test2;Test;2,Test
// ff和ie6下都是同样的运行结果,看来不是bug,那究竟是为什么呢?
// 注意到:对象方法访问其对象的属性时|必须|加以this.(和java不一样).
// 整个页面是默认的是|window|对象,那么定义的函数,默认就是window对象的方法。
//直接直接调用函数时,相当于通过window.调用方法,那么方法内部的this自然就是\
//window对象,this.name='Test'就是为window对象加了一个属性.
// 那么当方法局部作用域内未定义name且调用alert(name),就相当于调用alert(window.name);
/*啊,代码混乱了。这看起来像一个很严重的陷阱!!*/
相关推荐
-
JavaScript的9个陷阱及评点分析
1. 最后一个逗号 如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此).IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描. <script> var theObj = { city : "Boston", state : "MA", } </script> 2. this的引用会改变 如这段代码: <input
-
JavaScript中常见陷阱小结
你所创建的所有函数都是区分大小写的 单引号('字符串')和双引号("字符串")在JavaScript中没有特殊的区别,都可以用来创建字符串.但作为一般原则,大多数WEB开发者都选择使用单引号 而不是双引号,因为XHTML规范要求所有XHTML属性值都必须使用双引号括起来. JavaScript不支持重载,在JavaScript中,脚本在执行时不会顾及函数定义时的参数,而是直接使用在作用域链中最后定义的那个函数.这意味着,相同名称的函数永远只存在一个实例 闭包是与作用域相关的一个概念,它
-
JavaScript中常见的八个陷阱总结
前言 这里我们针对JavaScript初学者给出一些技巧和列出一些陷阱.如果你已经是一个砖家,也可以读一读. 1. 你是否尝试过对数组元素进行排序? JavaScript默认使用字典序(alphanumeric)来排序.因此, [1,2,5,10].sort()的结果是[1, 10, 2, 5]. 如果你想正确的排序,应该这样做: [1,2,5,10].sort((a, b) => a - b) 2. new Date() 十分好用 new Date()可以接收: - 不接收任何参数:返回当前时
-
错误剖析之JavaScript的9个陷阱及评点
来自Nine Javascript Gotchas, 以下是JavaScript容易犯错的九个陷阱.虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier. 笔者对某些陷阱会混杂一些评点. 1.最后一个逗号 如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此).IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描. var theObj = { city : "Boston
-
在JavaScript中遭遇级联表达式陷阱
依稀还记得,在学习C语言的库函数时,很多字符串操作相关的函数都会返回和结果相关的指针.其实这个返回值很多时候都并不是非常必要,因为在我们的传入的参数中,十有八九已包含了这个指针.而加上这个返回值的最大好处就是,可以让我们方便的书写出级联表达式.但是这些年的实际工作中,越发觉得级联表达式是个魔鬼馅饼. 比如在C语言中,我们熟悉的字符串操作函数strcpy,strcat等,它们的原形一般是: extern char *strxxx(char *dest, char *src); 返回值cha
-
JavaScript中for..in循环陷阱介绍
大家都知道在JavaScript中提供了两种方式迭代对象: (1)for 循环: (2)for..in循环: 使用for循环进行迭代数组对象,想必大家都已经司空见惯了.但是,使用for.. in循环时,大家可要注意了,为什么这么说呢?大家听我娓娓道来.... javascript提供了一种特殊的循环(也就是for .. in循环),用来迭代对象的属性或数组的每个元素,for...in循环中的循环计数器是字符串,而不是数字.它包含当前属性的名称或当前数组元素的索引. 案例一: 复制代码 代码如下:
-
比较搞笑的js陷阱题
看如下代码: 复制代码 代码如下: var a = function(t) { return t; } (1 + 2).toString(); alert(a); 结果是多少? 其实主要问题出在第一行后面没有分号,所以其实是var a = function(t) { return t; }(1 + 2).toString(); 先建立变量a,然后执行赋值语句,匿名函数传入参数1+2执行,返回结果.toString(),赋值给a. 关于这种function() {}()的写法,具体可参看js的命名
-
JavaScript性能陷阱小结(附实例说明)
1.避免使用eval或者Function构造函数 2.避免使用with 3.不要在性能要求关键的函数中使用try-catch-finally 4.避免使用全局变量 5.避免在性能要求关键的函数中使用for-in 6.使用字符串累加计算风格 7.原操作会比函数调用快 8.设置setTimeout() 和 setInterval() 时传递函数名而不是字符串 9.避免在对象中使用不需要的DOM引用 10.最清晰的目标速度,最小化作用域链 11.试着在脚本中少使用注释,避免使用长变量名 12.在当前作
-
JavaScript 存在陷阱 删除某一区域所有节点
比较简单的,例如:有一区域<div id="newbody" ></div>,现要求删除其中所有节点.相信很多人会这样写: 复制代码 代码如下: var divpanel = document.getElementById("newbody"); var controlinfo= divpanel.childNodes; for(var index = 0;index < controlinfo.length ;index++) { d
-
帮助避免错误的Javascript陷阱清单
翻译讲究"信\雅\达",我就谈不上了.希望能把文章的意思不要弄错就行. 编程的陷阱(gotcha)是指计算机系统中的意想不到的文档特征而不是bug.这些陷阱使得初学者远离javascript编程.在我看来,因为所有的浏览器都能运行javascript使得它是使用最广泛的语言之一,但它也是最少人研究的.让我们从一个基础的示例开始. 1.浮点运算 这可能是挫败一些对javascript不熟悉并准备执行一些数学运算的人的主要原因. <script> alert(0.02 /
随机推荐
- 手机屏幕尺寸测试——手机的实际显示页面的宽度
- 基于gulp合并压缩Seajs模块的方式说明
- javascript使用switch case实现动态改变超级链接文字及地址
- Docker-client for python详解及简单示例
- 又拍云存储同步脚本
- 原生js与jQuery实现简单的tab切换特效对比
- 微信小程序开发教程-手势解锁实例
- java实现oracle插入当前时间的方法
- javascript indexOf函数使用说明
- jQuery验证插件validate使用方法详解
- 用JavaScript修改CSS属性的代码
- 基于C++ cin、cin.get()、cin.getline()、getline()、gets()函数的使用详解
- js字符串操作总结(必看篇)
- Linux操作系统与命令知识汇总
- 为TextBox装饰水印与(blur和focus)事件应用
- 针对初学PHP者的疑难问答(1)
- php实现数组纵向转横向并过滤重复值的方法分析
- struts2的流程和一系列相关知识代码解析
- Python复制Word内容并使用格式设字体与大小实例代码
- MySQL用户权限验证与管理方法详解