代码1:
<script> var gisService = (function(window) { return { name:function () { alert(1); } }; })(this); gisService.name(); </script>
这种写法没有什么问题呀,尤其是对java开发人员来说,java中我们一般会采用这种大括号对齐的方式编写java的类或者函数。但是这段javascript代码在Chrome下会报错:Uncaught SyntaxError: Unexpected token ( 。
代码2:
<script> var gisService = (function(window) { return { name:function () { alert(1); } }; })(this); gisService.name(); </script>
代码2与代码1几乎是一模一样的,唯一的差别在于return后面的大括号。但是代码2可以在chrome下正常运行。不知道这是什么原因,不过很显然这是javascript设计上的缺陷,因为代码1和代码2仅仅是格式化和排版不一样。
代码3:
<script> var gisService = (function(window) { function name() { alert(1); } return { name:name }; })(this); gisService.name(); </script>
chrome下运行代码3会报错:Uncaught TypeError: Cannot read property ‘name’ of undefined。
javascript有一个自动修复机制——在程序可能有缺陷的时候,自动插入分号补全,但这个机制很不靠谱,常常会掩盖一些错误。比如:
return { hello:"world"; };
正常的理解是返回一个字面量构成的对象。但是如果这么写:
return { hello:"world" };
javascript的自动补全会将上面代码变成:
return; { hello:"world" };
实际返回一个undefined,这种错误不会有任何提示。知道这个自动补全机制后,就不难理解为什么代码3会报错了。
下面几种定义函数的方式,只有方式1是错误的。这也可以解释为啥代码1会报错了。
// 方式1:错误 { name:function(){ } }; // 方式2:正确 var obj = { name:function(){ } }; //方式3:正确 ({ name:function(){ } }); //方式4:正确 function name() { } { name:name };
文章来源:http://blog.csdn.net/aitangyong/article/details/44066295
相关推荐
在本文中,我们将探讨一些JavaScript设计缺陷,这些缺陷对JS新手和经验丰富的开发者来说都是让人头疼的问题。 1. 正则表达式的lastIndex属性 JS中的RegExp对象具有一个lastIndex属性,当正则表达式使用了表示全局...
然而,ECMAScript中并没有引入类的概念,这就使得JavaScript中的对象与传统面向对象语言中的对象存在差异。 接下来,我们将详细探讨在进行面向对象与原型的学习时所需的条件。首先,基础是必不可少的。JavaScript的...
在传统的JavaScript类设计中,通常会在构造函数中初始化实例的所有属性。例如: ```javascript class MyClass { constructor() { this.data = someExpensiveComputation(); } } ``` 这里`...
JavaScript中的`for...in`循环是用来迭代对象的所有可枚举属性,包括那些从原型链继承而来的属性。然而,这个语法结构存在一些显著的缺陷,这些缺陷在处理不同浏览器和JavaScript环境时尤其需要注意。 首先,`for.....
在JavaScript编程中,“闭包”是一个非常重要的概念,尤其对于希望深入理解和高效使用JavaScript的开发者来说。简单地说,闭包是一种能够记住并访问其创建时周围环境的函数。这种能力使得闭包能够在函数执行完毕后...
在早期版本的 Internet Explorer 中,由于某些内部实现的缺陷,闭包可能导致内存泄漏。例如,如果一个DOM元素的事件处理器形成了一个闭包,并且该元素永远不会被移除,那么就可能发生内存泄漏。 #### 五、结论 ...
本文将深入探讨 JavaScript 中创建对象及对象继承的各种有效策略,特别是如何利用构造函数模式、原型模式以及寄生组合式继承等技术来构建灵活、高效的应用程序。 #### 二、JavaScript 对象与原型 在 JavaScript 中...
在讨论JavaScript中的toFixed方法时,我们经常会遇到一种情况,即在浮点数运算中由于二进制精度缺失导致计算结果出现不精确的问题。toFixed方法是JavaScript提供的一个字符串方法,用于将数字格式化为保留指定位数的...
在JavaScript编程中,类型检测是非常重要的一个环节。对于数据类型的判断,JavaScript提供了typeof和instanceof两个操作符。这两个操作符是检测数据类型的常用方法,但它们各自存在一定的局限性。本文将通过分析这两...
在JavaScript中,定义类是构建面向对象程序的基本方式之一。本文主要汇总了在JavaScript中定义类的多种方法,并对每...通过了解和掌握这些方法,我们可以更加灵活地运用面向对象的思想来设计和开发JavaScript应用程序。
QUnit 是一个由 jQuery 团队开发的JavaScript单元测试框架,专为JavaScript代码的调试和测试设计。作为jQuery的官方测试工具,QUnit不仅适用于测试jQuery库本身,还能广泛应用于任何常规JavaScript代码,甚至能够在...
但是这个代码有点小缺陷,就是不支持预编译,这里加了2行代码使它能够支持预编译; var newFun=new Function(code.replace(/[\r\t\n]/g, '')); return options?newFun.apply(options):function(options){return ...
Javascript技巧有缺陷的数学0.1 + 0.2!= 0.3 0.1 + 0.2 == 0.30000000000000004 console.log(0.1+0.2);简单的变量可以被复制并将是新的 var x = 1;var y = x;x = 2;console.log(x,y);结果:x = 2,y = 1复杂变量...
JavaScript模块依赖管理是JavaScript开发中不可或缺的一部分,它允许开发者组织代码,确保代码的可复用性和可维护性。本文将深入探讨JavaScript模块依赖管理的概念、实现方法及其在实际开发中的应用。 首先,让我们...
然而,这种方法也有缺陷:如果多次添加同一个class,则会导致重复,如`class="div2 div3 div3"`。 #### 方法三:检测已有class 为了避免重复添加class,我们需要一种机制来检测元素是否已经具有某个特定的class。...
在 JavaScript 中,给元素添加多个 class 是一个常见的需求。通常,我们可以通过使用 `className` 属性来实现,但是这个方法有其局限性。今天,我们将探讨如何使用 JavaScript 给元素添加多个 class 的简洁实现。 ...
但传统的JavaScript实现存在明显的缺陷,包括但不限于页面刷新后倒计时重新开始、计时不精确以及无法确保所有客户端同步等。 #### 2. 防刷新防关闭自校正的倒计时器设计思路 为了克服传统JavaScript倒计时器的不足...
总结来说,beforeunload事件在Firefox中之前存在的实现缺陷表明,Web开发者在设计需要用户确认的交互时,应当谨慎并考虑到不同浏览器可能存在的兼容性问题。开发者可以通过多种方式提前保存用户数据,比如使用Web...
需要注意的是,由于JavaScript的历史原因,`typeof null`也会返回`"object"`,这是一个已知的语言缺陷。除此之外,`typeof`操作符对于函数的判断是特定的,总是返回`"function"`,哪怕变量实际上并不是一个函数。在...