记悲剧的网吧环境下开发经历

自小机房别我后,就只能将周末寄托在网吧里,一直都很想写程序啊,比如Prever Start的应用,但是,没有开发工具,太痛苦了。

之前用记事本写过小的效果,因为可以本地调试,也就比较方便,前两天心血来潮,想写点简单应用,先是想弄个IM进来,看着QQ刚出了WebQQ Mini,而且发现登陆界面放在iframe里没什么问题,就误认为腾讯开化了。等到写得差不多了,往Prever上一放,再一登陆,它就把我的Prever跳转了…悲剧啊!

不过最痛苦的是昨天发生的事。昨天决定集成一个音乐播放器,因为没有本地开发环境,每次修改都需要更新服务器上的信息,FTP又一直登陆不上,又是国外服务器,那个速度啊,然后重新加载程序(还好当时开发Prever Start的时候远见了,给psp添加了一个重新加载的功能,免得一个程序更新,整个系统都要重新加载,要不然肯定更加惨不忍睹),我选择了一款叫Nifty的Flash播放器,结果因为几个地方把Nifty写成了Nitfy,就耗费了我至少一小时…

当然,也因为我缺乏对Flash的操作经验,导致我一直以为问题是自己的代码实现有问题…

真想快点弄台手提…

网页应用的未来与对InviScript的憧憬

自己弄JS的两年来,因为AIVOS和Prever Start的开发,也算有过密集JS的开发经验了,自然,在这中间,也有自己的体验与憧憬。

随着JS在前端中运用的不断延伸,它在网页中的地位越来越高,并且,更多几乎完全承载于JS的网页或网页程序出现了。由于JS以浏览器作为平台,它被赋予了跨平台的能力,成为了未来轻量级应用的一个优势选择。

我相信在未来若干年,网页应用程序会逐步发展,并最终与桌面应用并肩。当然,或许那个时候会有一个专门运行网页应用的软件,而不是像现在那么突兀地放在浏览器里。但是受限于脚本语言的效率,网页应用的范围仍然会有较大的限制。

即使如此,如之前所说,在“轻量级”的应用中,JS网页应用仍然具有不可替代的优势——随时随地随心情。不过我这里所说的“轻量级”可并不是指功能简单,而是指对效率、图形处理等要求不高。并且,网页应用的体积限制也随着本地储存的发展渐渐放宽,加上可以随用随加载,功能将会越来越丰富。

这时候,我想JS将会难以胜任更大规模的网页应用开发。JS的下一个版本或许能赋予它更强的功能,但如众多前端开发人员所恼火的,浏览器的更替是一个缓慢的过程,这时,兼容问题便无法避免了。

于是我想到了C++。

听说在C++诞生之初,还没有专门的编译器,要编译C++,就必须先把C++翻译为C语言。那同样的,我们是否能将一个强大的语言翻译为JS呢?

我把这个想象中的语言称为InviScript,除了更强大与完善的语法结构外,它还可以提供一些JS难以具备的东西,比如源代码保护。当然,尽管我看到了这样一个语言的众多优势,却对它的开发难度有些恐惧——这已经远非我一个人所能完成的了。到现在,所有的向往也仅仅是向往,但希望不久的将来,我能用InviScript开发出自己的第一款大型JS应用——Prever 2。

JS在IE和FF中的语法兼容

在前端开发的浏览器兼容工作中,我觉得主要分为CSS样式兼容和Javascript脚本兼容,而脚本兼容又分为浏览器实现的兼容和语法本身的兼容,下面我会对我所了解的JS在不同浏览器中语法的细小差别做一个归纳。

一、函数声明
函数声明(姑且这样说)有两种方法:
function abc(){};
var abc=function(){};
这两个都是通用的,只是效果有些许不同,但试想下面一种情况:
var obj={};
//直接赋值一个函数
obj.abc=function(){};
//用function关键字声明
function obj.abc(){};
这两种写法都能正确的在IE中运行,但第二种却无法在FF中使用,于是,兼容的做法就是使用第一种。

二、函数的嵌套
有时我们会把函数嵌套在if语句中,虽然我不知道这是不是一个坏习惯,但它在不同的浏览器中的确存在不同。一般情况下,如果我们使用function关键字来声明一个函数,它似乎会在一开始就完成初始化,所以我们可以在前面的代码里使用后面的函数,但函数写在if里呢?惨痛的调试经验告诉我,FF不会在if中优先初始化,也就是说,在FF的if中,function关键字声明的函数等价于var声明的函数,它们会逐语句执行。这时如果把要用到的函数写在了后面,就会不幸地报错了。不过在IE里,它是允许的。兼容的方法也就是将函数写在前面,或者写在if之外。

额,写完了才发现都是关于函数的,等我搜索完我的脑袋,要是还有就再加。

JS类的技巧 在初始化对象前添加属性

写Prever Start的时候,曾遇到过这样的问题,就是通过new关键字实例化一个对象,却希望它的原型在运行之前能具备一些外来的属性,可惜的是像这样:

var obj=new myClass();

只有一个语句,怎么添加这些属性呢?

这个我们需要从JS中类实例化的实现原理上来讲了(声明,我也只是听说,但的确管用)。听群里的高手说,上面的那个语句就等价于

var obj={};
myClass.call(obj);

我就不解释意思了,很明显的,两个代码之间的间隔给我们的操作提供了可能。

var obj={};
//在这里添加,如:
obj.ID=123;
myClass.call(obj);

不过我想一般可能用不到这样的写法,但既然曾经用到过就有它的价值,在此分享下。

JS中对象的表示方法

Javascript作为一个脚本语言,因为它的灵活性,可以用很多写法来达到同样的目的,现在我想说下接触Javascript以来所了解的对象的表示方法。

方法一

var obj=new Object();

Object貌似是JS中所有对象的原型,像上面这样的方法也最直接。众所周知的,它还有另外一个等价的写法。

方法二

var obj={};

不过它有更强的扩展性,这也是JSON的基础:

var obj=
{
Name:”Object”,
Age:0,
SayHello:function(){alert(“Hello!”);}
};

貌似很多类库的书写和对象的初始化都是使用的这种方式,但有时候,我更喜欢另一种建立在类的基础上的方法(不知道是否是原创的)。

方法三

var obj=new function()
{
this.Name=”Object”;
this.Age=0;
this.SayHello=function(){alert(“Hello!”);};
}();

从上面的例子很难看到这个方法的优点,但假如说我们这个对象里需要私有变量,或者需要有被内部多次使用的函数时,它就十分有用了。

当然,好用与否不是绝对的,根据需要选择才是王道。

发现Xplore用中心那个确认键可以换行

为什么,为什么,用了那么久,我到现在才发现…
截止目前,用手机(传统键盘)一共写了大概三个JS小程序,其中一个是用LightNote写的小画板,觉得写得不错,调色板比较强,因为写了个渐变色的小功能。一个是贪食蛇,可以穿墙哦!这个还是同学提的意见。开发过程中还特意保存了一版,因为没有写游戏结束的条件,所以永远不死,我叫它不死版。还有一个是这两天写的一个飘雪效果,前面有文章,就不说了。后面两个都是用Xplore写的,但是直到今天,我才在无意中发现,原来可以这样…同志们可以想象,我是如何输入那一个又一个换行符的(其他符号我就不提了)…

第一次写雪花特效

第一次写雪花特效,没想到还是在手机上写的…之前把雪花数量设置成了50,那个卡啊…不过调整后在手机上看效果也将就。雪花比较简陋,是2×2的白色小方框,不过以后可以在CSS里改动。

附Demo(建议用S60自带浏览器看):
http://www.vilic.info/demo/s60/snow
参数是可以改动的,现在觉得这也是写程序的好习惯,保持!

JS中函数的传递(二)匿名函数

在JS函数传递的过程中,还有一种很重要的类型,便是匿名函数。当然,匿名函数的用途远不只函数传递,但本文仅对它在函数传递中的作用做一个简单的说明。

以下两个代码在效果上是基本等价的:

/*作者:Vilic Vane 博客:www.vilic.info*/
function abc(func)
{
func();
}

//代码1
function test()
{
alert(“Hello!”);
}
abc(test);

//代码2
abc(function(){alert(“Hello!”);});

可以看出,有时候通过书写匿名函数,可以节省代码量,但在有些时候,则会降低程序的可读性。关于匿名函数还有一个常用的技巧,即通过匿名函数(当然如果你愿意,或者函数较为复杂时,可以像上面的代码1那样单独书写一个函数)传递参数。那么,什么时候会用到呢?拿setTimeout来说,setTimeout有两个主要参数,一个是表达式或函数,一个是时间。通常,我们更多使用的是函数而不是表达式。但因为传递的函数是一个变量,所以,我们无法为它简单的加上参数,这个时候,JS闭包的优势就体现出来了。

setTimeout(function(){abc(/*参数在这里*/);}, 500);

顺便说到闭包,就提一下,看到很多地方说避免用闭包,其实我觉得闭包很有用,可以大大节省参数的传递成本。但前提是,必须有声明变量的好习惯。记得有一次发现自己Prever Start的图标排列的间隔总是和最后一个实例一样(当然一开始没发现得那么具体),才意识到是自己忘记了声明一个变量,自然,它也便成了全局变量了。