以图明志

JavaScript

JavaScript探秘:SpiderMonkey的怪癖

命名函数的标识符只在局部作用域中有效
大家都知道,命名函数表达式的标识符只在函数的局部作用域中有效。但包含这个标识符的局部作用域又是什么样子的吗?其实非常简单。在命名函数表达式被求值时,会创建一个特殊的对象,该对象的唯一目的就是保存一个属性,而这个属性的名字对应着函数标识符,属性的值对应着那个函数。这个对象会被注入到当前作用域链的前端。

JavaScript

JavaScript探秘:JScript的内存管理

命名函数表达式会导致产生多余的函数对象
我们知道,这个匿名函数调用返回的函数(带有标识符g的函数),然后赋值给了外部的f。我们也知道,命名函数表达式会导致产生多余的函数对象,而该对象与返回的函数对象不是一回事。所以这个多余的g函数就死在了返回函数的闭包中了,因此内存问题就出现了。这是因为if语句内部的函数与g是在同一个作用域中被声明的。

JavaScript

JavaScript探秘:JScript的Bug

IE的ECMAScript严重混淆了命名函数表达式
比较恶的是,IE的ECMAScript实现JScript严重混淆了命名函数表达式,搞得现很多人都出来反对命名函数表达式,而且即便是最新的一版(IE8中使用的5.8版)仍然存在下列问题。下面我们就来看看IE在实现中究竟犯了那些错误,俗话说知已知彼,才能百战不殆。

JavaScript

JavaScript探秘:调试器中的函数名

将函数的名字显示在调用的栈上
如果一个函数有名字,那调试器在调试的时候会将它的名字显示在调用的栈上。有些调试器(Firebug)有时候还会为你们函数取名并显示,让他们和那些应用该函数的便利具有相同的角色,可是通常情况下,这些调试器只安装简单的规则来取名,所以说没有太大价值。

JavaScript

JavaScript探秘:命名函数表达式

var bar = function foo(){};
函数表达式在实际应用中还是很常见的,在web开发中友个常用的模式是基于对某种特性的测试来伪装函数定义,从而达到性能优化的目的,但由于这种方式都是在同一作用域内,所以基本上一定要用函数表达式。提到命名函数表达式,理所当然,就是它得有名字,前面的例子var bar = function foo(){};就是一个有效的命名函数表达式。

JavaScript

JavaScript探秘:函数声明与函数表达式

创建函数的最常用的两个方法
在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符。如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?

JavaScript

JavaScript探秘:基本编码规范

建立和遵循编码规范是很重要
建立和遵循编码规范是很重要的,这让你的代码保持一致性,可预测,更易于阅读和理解。一个新的开发者加入这个团队可以通读规范,理解其它团队成员书写的代码,更快上手干活。许多激烈的争论发生会议上或是邮件列表上,问题往往针对某些代码规范的特定方面(例如代码缩进,是Tab制表符键还是space空格键)。

JavaScript

JavaScript探秘:用parseInt()进行数值转换

顾名思意,不是简单地解析与转换
使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不应该。当字符串以”0″开头的时候就有可能会出问题,例如,部分时间进入表单域,在ECMAScript 3中,开头为”0″的字符串被当做8进制处理了,但这已在ECMAScript 5中改变了。为了避免矛盾和意外的结果,总是指定基数参数。

JavaScript

JavaScript探秘:eval()是“魔鬼”

eval()可以干扰作用域链
如果你现在的代码中使用了eval(),记住该咒语“eval()是魔鬼”。此方法接受任意的字符串,并当作JavaScript代码来处理。当有问题的代码是事先知道的(不是运行时确定的),没有理由使用eval()。如果代码是在运行时动态生成,有一个更好的方式不使用eval而达到同样的目标。例如,用方括号表示法来访问动态属性会更好更简单。

JavaScript

JavaScript探秘:Prototypes强大过头了

不增加内置原型是最好的
扩增构造函数的prototype属性是个很强大的增加功能的方法,但有时候它太强大了。增加内置的构造函数原型(如Object(), Array(), 或Function())挺诱人的,但是这严重降低了可维护性,因为它让你的代码变得难以预测。使用你代码的其他开发人员很可能更期望使用内置的 JavaScript方法来持续不断地工作,而不是你另加的方法。

JavaScript

JavaScript探秘:for-in循环(for-in Loops)

使用for-in进行循环也被称为“枚举”
for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的。因为如果数组对象已被自定义的功能增强,就可能发生逻辑错误。另外,在for-in中,属性列表的顺序(序列)是不能保证的。所以最好数组使用正常的for循环,对象使用for-in循环。

JavaScript

JavaScript探秘:for循环(for Loops)

不足在于每次循环的时候数组的长度都要去获取
在for循环中,你可以循环取得数组或是数组类似对象的值,譬如arguments和HTMLCollection对象。这种形式的循环的不足在于每次循环的时候数组的长度都要去获取下。这回降低你的代码,尤其当myarray不是数组,而是一个HTMLCollection对象的时候。

JavaScript

JavaScript探秘:var预解析与副作用

var定义变量二三事
隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。

JavaScript

JavaScript探秘:谨慎使用全局变量

全局对象与全局变量介绍
JavaScript通过函数管理作用域。在函数内部声明的变量只在这个函数内部可用,而在函数外面不可用。另一方面,全局变量就是在任何函数外面声明的或是未声明直接简单使用的。每个JavaScript环境有一个全局对象,当你在任意的函数外面使用this的时候可以访问到。

JavaScript

JavaScript探秘:编写可维护的代码的重要性

Writing Maintainable Code
软件bug的修复是昂贵的,并且随着时间的推移,这些bug的成本也会增加,尤其当这些bug潜伏并慢慢出现在已经发布的软件中时。当你发现bug 的时候就立即修复它是最好的,此时你代码要解决的问题在你脑中还是很清晰的。否则,你转移到其他任务,忘了那个特定的代码,一段时间后再去查看这些代码就需要花时间学习和理解这个问题。

JavaScript

我们应该如何去了解JavaScript引擎的工作原理

与学习方法有关
简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。学过编译原理的人都知道,对于静态语言来说(如Java、C++、C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器(Interpreter)。
22 / 25 首页 < Prev 20 21 22 23 24 Next > 尾页 页码: