编写一个javascript编写工具程序,图片所以问题

一个JavaScript问题,代码如图所示:_百度知道
一个JavaScript问题,代码如图所示:
jpg" esrc="http.hiphotos.baidu,很难理解.com/zhidao/pic/item/f31fbe096b63febc8544ebf81a4ca337.baidu.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink">第13行为什么要加上“()”://d<a href="/zhidao/wh%3D450%2C600/sign=938b3449a5efce1bea7ec0ce9a61dfe8/f31fbe096b63febc8544ebf81a4ca337://d.hiphotos,求高手指教.baidu.hiphotos://d
提问者采纳
表示函数自己调用自己。
然后把返回值赋值给person
var person = function(){...}这段代码不是已经调用函数了吗,为什么还要自己调用自己呢?
var person = function(){...}这不是调用
将函数赋值给personvar person = function(){...}()表示
并把返回值赋给person 第一种就像下面的function ss(){}var person=而第二中是这个var person=ss();ss()
&#47;&#47;才是调用函数
提问者评价
原来如此,谢谢!!!
其他类似问题
javascript的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1. 模块的定义和加载
1.1 模块的定义
一个框架想要能支撑较大的应用,首先要考虑怎么做模块化。有了内核和模块加载系统,外围的模块就可以一个一个增加。不同的JavaScript框架,实现模块化方式各有不同,我们来选择一种比较优雅的方式作个讲解。
先问个问题:我们做模块系统的目的是什么?如果觉得这个问题难以回答,可以从反面来考虑:假如不做模块系统,有什么样的坏处?
我们经历过比较粗放、混乱的前端开发阶段,页面里充满了全局变量,全局函数。那时候要复用js文件,就是把某些js函数放到一个文件里,然后让多个页面都来引用。
考虑到一个页面可以引用多个这样的js,这些js互相又不知道别人里面写了什么,很容易造成命名的冲突,而产生这种冲突的时候,又没有哪里能够提示出来。所以我们要有一种办法,把作用域比较好地隔开。
JavaScript这种语言比较奇怪,奇怪在哪里呢,它的现有版本里没package跟class,要是有,我们也没必要来考虑什么自己做模块化了。那它是要用什么东西来隔绝作用域呢?
在很多传统高级语言里,变量作用域的边界是大括号,在{}里面定义的变量,作用域不会传到外面去,但我们的JavaScript大人不是这样的,他的边界是function。所以我们这段代码,i仍然能打出值:
for (var i=0; i&5; i++) {
//do something
那么,我们只能选用function做变量的容器,把每个模块封装到一个function里。现在问题又来了,这个function本身的作用域是全局的,怎么办?我们想不到办法,拔剑四顾心茫然。
我们有没有什么可参照的东西呢?这时候,脑海中一群语言飘过:
C语言飘过:“我不是面向对象语言哦~不需要像你这么组织哦~”,“死开!”
Java飘过:“我是纯面向对象语言哦,连main都要在类中哦,编译的时候通过装箱清单指定入口哦~”,“死开!”
C++飘过:“我也是纯面向对象语言哦”,等等,C++是纯面向对象的语言吗?你的main是什么???main是特例,不在任何类中!
啊,我们发现了什么,既然无法避免全局的作用域,那与其让100个function都全局,不如只让一个来全局,其他的都由它管理。
本来我们打算自己当上帝的,现在只好改行先当个工商局长。你想开店吗?先来注册,不然封杀你!于是良民们纷纷来注册。店名叫什么,从哪进货,卖什么的,一一登记在案,为了方便下面的讨论,我们连进货的过程都让工商局管理起来。
店名,指的就是这里的模块名,从哪里进货,代表它依赖什么其他模块,卖什么,表示它对外提供一些什么特性。
好了,考虑到我们的这个注册管理机构是个全局作用域,我们还得把它挂在window上作为属性,然后再用一个function隔离出来,要不然,别人也定义一个同名的,就把我们覆盖掉了。
(function() {
window.thin = {
define: function(name, dependencies, factory) {
//register a module
在这个module方法内部,应当怎么去实现呢?我们的module应当有一个地方存储,但存储是要在工商局内部的,不是随便什么人都可以看到的,所以,这个存储结构也放在工商局同样的作用域里。
用什么结构去存储呢?工商局备案的时候,店名不能跟已有的重复,所以我们发现这是用map的很好场景,考虑到JavaScript语言层面没有map,我们弄个Object来存。
(function() {
var moduleMap = {};
window.thin = {
define: function(name, dependencies, factory) {
if (!moduleMap[name]) {
var module = {
name: name,
dependencies: dependencies,
factory: factory
moduleMap[name] =
return moduleMap[name];
现在,模块的存储结构就搞好了。
1.2 模块的使用
存的部分搞好了,我们来看看怎么取。现在来了一个商家,卖木器的,他需要从一个卖钉子的那边进货,卖钉子的已经来注册过了,现在要让这个木器厂能买到钉子。现在的问题是,两个商家处于不同的作用域,也就是说,它们互相不可见,那通过什么方式,我们才能让他们产生调用关系呢?
个人解决不了的问题还是得靠政府,有困难要坚决克服,没有困难就制造困难来克服。现在困难有了,该克服了。商家说,我能不能给你我的进货名单,你帮我查一下它们在哪家店,然后告诉我?这么简单的要求当然一口答应下来,但是采用什么方式传递给你呢?这可犯难了。
我们参考AngularJS框架,写了一个类似的代码:
thin.define(&A&, [], function() {
//module A
thin.define(&B&, [&A&], function(A) {
//module B
var a = new A();
看这段代码特别在哪里呢?模块A的定义,毫无特别之处,主要看模块B。它在依赖关系里写了一个字符串的A,然后在工厂方法的形参写了一个真真切切的A类型。嗯?这个有些奇怪啊,你的A类型要怎么传递过来呢?其实是很简单的,因为我们声明了依赖项的数组,所以可以从依赖项,挨个得到对应的工厂方法,然后创建实例,传进来。
use: function(name) {
var module = moduleMap[name];
if (!module.entity) {
var args = [];
for (var i=0; i&module.dependencies. i++) {
if (moduleMap[module.dependencies[i]].entity) {
args.push(moduleMap[module.dependencies[i]].entity);
args.push(this.use(module.dependencies[i]));
module.entity = module.factory.apply(noop, args);
return module.
我们可以看到,这里面递归获取了依赖项,然后当作参数,用这个模块的工厂方法来实例化了一下。这里我们多做了一个判断,如果模块工厂已经执行过,就缓存在entity属性上,不需要每次都创建。以此类推,假如一个模块有多个依赖项,也可以用类似的方式写,毫无压力:
thin.define(&D&, [&A&, &B&, &C&], function(A, B, C) {
//module D
var a = new A();
var b = new B();
var c = new C();
注意了,D模块的工厂,实参的名称未必就要是跟依赖项一致,比如,以后我们代码较多,可以给依赖项和模块名称加命名空间,可能变成这样:
thin.define(&foo.D&, [&foo.A&, &foo.B&, &foo.C&], function(A, B, C) {
//module D
var a = new A();
var b = new B();
var c = new C();
这段代码仍然可以正常运行。我们来做另外一个测试,改变形参的顺序:
thin.define(&A&, [], function() {
return &a&;
thin.define(&B&, [], function() {
return &b&;
thin.define(&C&, [], function() {
return &c&;
thin.define(&D&, [&A&, &B&, &C&], function(B, A, C) {
return B + A + C;
var D = thin.use(&D&);
试试看,我们的D打出什么结果呢?结果是&abc&,所以说,模块工厂的实参只跟依赖项的定义有关,跟形参的顺序无关。我们看到,在AngularJS里面,并非如此,实参的顺序是跟形参一致的,这是怎么做到的呢?
我们先离开代码,思考这么一个问题:如何得知函数的形参名数组?对,我们是可以用func.length得到形参个数,但无法得到每个形参的变量名,那怎么办呢?
AngularJS使用了一种比较极端的办法,分析了函数的字面量。众所周知,在JavaScript中,任何对象都隐含了toString方法,对于一个函数来说,它的toString就是自己的实现代码,包含函数签名和注释。下面我贴一下AngularJS里面的这部分代码:
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/
function annotate(fn) {
var $inject,
if (typeof fn == &#39;function&#39;) {
if (!($inject = fn.$inject)) {
$inject = [];
fnText = fn.toString().replace(STRIP_COMMENTS, &#39;&#39;);
argDecl = fnText.match(FN_ARGS);
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
arg.replace(FN_ARG, function(all, underscore, name){
$inject.push(name);
fn.$inject = $
} else if (isArray(fn)) {
last = fn.length - 1;
assertArgFn(fn[last], &#39;fn&#39;);
$inject = fn.slice(0, last);
assertArgFn(fn, &#39;fn&#39;, true);
可以看到,这个代码也不长,重点是类型为function的那段,首先去除了注释,然后获取了形参列表字符串,这段正则能获取到两个结果,第一个是全函数的实现,第二个才是真正的形参列表,取第二个出来split,就得到了形参的字符串列表了,然后按照这个顺序再去加载依赖模块,就可以让形参列表不对应于依赖项数组了。
AngularJS的这段代码很强大,但是要损耗一些性能,考虑到我们的框架首要原则是简单,甚至可以为此牺牲一些灵活性,我们不做这么复杂的事情了。
1.3 模块的加载
到目前为止,我们可以把多个模块都定义在一个文件中,然后手动引入这个js文件,但是如果一个页面要引用很多个模块,引入工作就变得比较麻烦,比如说,单页应用程序(SPA)一般比较复杂,往往包含数以万计行数的js代码,这些代码至少分布在几十个甚至成百上千的模块中,如果我们也在主界面就加载它们,载入时间会非常难以接受。但我们可以这样看:主界面加载的时候,并不是用到了所有这些功能,能否先加载那些必须的,而把剩下的放在需要用的时候再去加载?
所以我们可以考虑万能的AJAX,从服务端获取一个js的内容,然后……,怎么办,你当然说不能eval了,因为据说eval很evil啦,但是它evil在哪里呢?主要是破坏全局作用域啦,怎么怎么,但是如果这些文件里面都是按照我们规定的模块格式写,好像也没有什么在全局作用域的……,好吧。
算了,我们还是用最简单的方式了,就是动态创建script标签,然后设置src,添加到document.head里,然后监听它们的完成事件,做后续操作。真的很简单,因为我们的框架不需要考虑那么多种情况,不需要AMD,不需要require那么麻烦,用这框架的人必须按照这里的原则写。
所以,说真的我们这里没那么复杂啦,要是你们想看更详细原理的不如去看这个,解释得比我好哎:/articles/9749.html#jtss-tsina
[补一段,@Franky 大神指出了这篇文章中一些不符合现状的地方,我把它也贴在这里,供读者参考]
很多观点都是 史蒂夫那本老书上的观点. 和那时候同期产生的一些数据和资料...所以显得不少东西说的太想当然了...
譬如script标签的加载和执行会阻塞后面资源的加载和执行之类的.说的过于肯定了.
比如chrome7+就开始逐渐改进的 预加载机制 就分
head 里的资源, body里的资源 .两个资源是否跨界三种情形. 不提这些浏览器. 我们看看ie10也同样改进了
死循环10秒
这后面的图片能被提前加载.
就更不用说其他A级浏览器的丰富的优化策略了.
所以还是建议博主,
别拿几年前的老资料作为依据.尤其这些数据是用来说明更新速度像在赛跑一样的各个浏览器了.
关于 defer , 似乎史蒂夫的老书上是这么说的么?
显然没有测试全非ie浏览器的各个版本.或者是他测试数据的时候ff某大版本的几个beta子版本还没出现?
其次是就你的加载器提到的预加载策略.
你有测过所有浏览器用object预加载可能涉及到的问题么(比如chrome,8,9的预加载的会话级别的资源类型缓存bug).
抛开这个问题不谈,假设你预加载到一半,用户再次触发了加载.你觉得这种情况如果频繁发生.是否合适?
你的预加载策略连script.onload状态都无法测知,进一步优化的可能性就消失了.
考虑下为什么seajs 的
umd要设计成那个样子?
最后吐槽下你的代码. 有注意到你用 document.body.appendChild 来像dom 中插入脚本. 我的建议是
永远不要这样做.除非你可以无视ie6用户.以及ie7缺失某些补丁的子版本.
你可以选择body 可以.但请用insertBefore. 但在某些极端情况下.这仍然会发生问题. 最佳实践是
head.insertBefore 向其第一个子节点插入.(你甚至无需检测是否存在子节点.
这个api会在没有子节点的时候,行为同appendChild).
而更加稳妥的情况是. 如果注入script.
发现document.head还没有被构建时. 可以自己造一个. 这才是一个通用加载器要做到的程度...
我也偷懒了,只是贴一下代码,顺便解释一下,界面把所依赖的js文件路径放在数组里,然后挨个创建script标签,src设置为路径,添加到head中,监听它们的完成事件。在这个完成时间里,我们要做这么一些事情:在fileMap里记录当前js文件的路径,防止以后重复加载,检查列表中所有文件,看看是否全部加载完了,如果全加载好了,就执行回调。
require: function (pathArr, callback) {
for (var i = 0; i & pathArr. i++) {
var path = pathArr[i];
if (!fileMap[path]) {
var head = document.getElementsByTagName(&#39;head&#39;)[0];
var node = document.createElement(&#39;script&#39;);
node.type = &#39;text/javascript&#39;;
node.async = &#39;true&#39;;
node.src = path + &#39;.js&#39;;
node.onload = function () {
fileMap[path] =
head.removeChild(node);
checkAllFiles();
head.appendChild(node);
function checkAllFiles() {
var allLoaded =
for (var i = 0; i & pathArr. i++) {
if (!fileMap[pathArr[i]]) {
allLoaded =
if (allLoaded) {
callback();
到此为止,我们的简易框架的模块定义系统就完成了。完整的代码如下:
(function () {
var moduleMap = {};
var fileMap = {};
var noop = function () {
var thin = {
define: function(name, dependencies, factory) {
if (!moduleMap[name]) {
var module = {
name: name,
dependencies: dependencies,
factory: factory
moduleMap[name] =
return moduleMap[name];
use: function(name) {
var module = moduleMap[name];
if (!module.entity) {
var args = [];
for (var i=0; i&module.dependencies. i++) {
if (moduleMap[module.dependencies[i]].entity) {
args.push(moduleMap[module.dependencies[i]].entity);
args.push(this.use(module.dependencies[i]));
module.entity = module.factory.apply(noop, args);
return module.
require: function (pathArr, callback) {
for (var i = 0; i & pathArr. i++) {
var path = pathArr[i];
if (!fileMap[path]) {
var head = document.getElementsByTagName(&#39;head&#39;)[0];
var node = document.createElement(&#39;script&#39;);
node.type = &#39;text/javascript&#39;;
node.async = &#39;true&#39;;
node.src = path + &#39;.js&#39;;
node.onload = function () {
fileMap[path] =
head.removeChild(node);
checkAllFiles();
head.appendChild(node);
function checkAllFiles() {
var allLoaded =
for (var i = 0; i & pathArr. i++) {
if (!fileMap[pathArr[i]]) {
allLoaded =
if (allLoaded) {
callback();
window.thin =
测试代码如下:
thin.define(&constant.PI&, [], function() {
return 3.14159;
thin.define(&shape.Circle&, [&constant.PI&], function(pi) {
var Circle = function(r) {
Circle.prototype = {
area : function() {
return pi * this.r * this.r;
thin.define(&shape.Rectangle&, [], function() {
var Rectangle = function(l, w) {
Rectangle.prototype = {
area: function() {
return this.l * this.w;
thin.define(&ShapeTypes&, [&shape.Circle&, &shape.Rectangle&], function(Circle, Rectangle) {
CIRCLE: Circle,
RECTANGLE: Rectangle
thin.define(&ShapeFactory&, [&ShapeTypes&], function(ShapeTypes) {
getShape: function(type) {
switch (type) {
case &CIRCLE&: {
shape = new ShapeTypes[type](arguments[1]);
case &RECTANGLE&:
shape = new ShapeTypes[type](arguments[1], arguments[2]);
var ShapeFactory = thin.use(&ShapeFactory&);
alert(ShapeFactory.getShape(&CIRCLE&, 5).area());
alert(ShapeFactory.getShape(&RECTANGLE&, 3, 4).area());
在这个例子里定义了四个模块,每个模块只需要定义自己所直接依赖的模块,其他的可以不必定义。也可以来这里看测试链接:http://xufei.github.io/thin/demo/demo.0.1.html
好奇怪,问一下,那个require()函数怎么没有使用到?那它的用途是什么了
貌似在jQuery里没看到类似define, use这些用法,能不能说jQuery没有这篇里描述的模块定义和加载呢?
这正是我要找的东西,无意中看到的一刹那,眼前一亮。
额,难道没有后续的了?
好了,考虑到我们的这个注册管理机构是个全局作用域,我们还得把它挂在window上作为属性,然后再用一个function隔离出来,要不然,别人也定义一个同名的,就把我们覆盖掉了。
“挂在window上作为属性”可以避免同名覆盖么? 如果在匿名函数外边定义一个thin也会覆盖掉吧?
有点不理解,博主解惑一下 : )
写的非常好!把我这块的知识体系又完善了一下。谢谢!!
好文,支持一下,写完这个系列可以出书了
学习啦,支持一下,期待持续更新
用什么结构去存储呢?工商局备案的时候,店名不能跟已有的重复,所以我们发现这是用hash的很好场景,考虑到JavaScript语言层面没有hash,我们弄个Object来存。
map和hash是两回事,你这里讲的是map。而且map可以覆盖,有的map允许多值。用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM
感谢的投递
新闻来源:原创
今日目睹某网络新闻,开篇明义便包含如下几行文字【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个java虚拟机BicaVM】
继而再读,惊见其中“超级大牛”、“神人”等溢美之词不绝于耳,崇拜、神往之心溢于言表。仿佛BicaVM就是天上有地下无的创举,仿佛Artur
Ventura就是继比尔盖茨,乔布斯之后的第三位IT业领军人。然而很可惜,小弟今天准备要“侮辱”一下这位“大牛”了。
只因在小弟看来,这篇文章,乃
至其中介绍的BicaVM,都如某女士对某御用文人的评价一样“实无耻之尤,足令人作三日呕”。什么“自动化的沙盒”、“具有支持JNI接口,DOM模型
等特点”,说起来果然天花乱坠,似乎有什么高明玄妙。
其实归根结底,BicaVM无非就由两种东西所构成,一种叫炒作,而另一种,就叫做扯淡。
众所周知,本来JS就是解释性的语言,而BicaVM是什么东西,是一个能够让JS运行字节码(直接读取class)的WEB版JVM。也就是说,他要用
自身还需浏览器进行解释的JavaScript,再去“解释”已编译为Class的Java Byte
Code……上苍啊!即便不讨论性能问题,这也根本是“让翻译找翻译去翻译句子给你听”式的绕口令了吧?别的不讲,单就如此脑残的行为,还有人管这叫“大
牛”?别“牛”了,不被评价为“猪”,就算别人嘴下积德!
再看看BicaVM的类库,既然实现目的是在浏览器中使用JVM,按理说应该是为前端WEB开发搞的吧?可号称已经模拟了“60% Byte
Code”功能的BicaVM中,我却连半个可视化组件也看不见(当然,可以调取JS指令构建出“窗体”,但这和Java有半毛钱关系吗?直接写不更快,
本来语法就近似),半个网络工具也找不到,唯一能找到的,就是一堆堆冗余却无用的类加载器与Java基础数据类型的JS实现(N多对于JS来讲重复的“轮
子”……)
比如Java中的Long,在BicaVM中需要如此实现(部分源码,太长无法显示全,位于22KB的long.js中)。
不知道各位都看见了什么,我所见者,就仅仅是一个蠢货为了让BicaVM中基本数据类型与标准Java保持一致,而强迫弱类型的JS去做冗长的强类型运算
而已——凡有点JS开发经验者,你们能相信在客户端跑着如此海量的科学计算的后果吗?能相信这是正常人类想出来的办法吗?(BicaVM的基本数据类型全
是这样“造”出来的,所以只要用,这些运算就没完了)
可以说,BicaVM仅仅只是一个概念,一个看上去也不美的,JS仿“完整版Java”的概念(而且主要部分都没实现),可以说,其中真正能起作用的东西,连半个也不存在。(另外,就连概念也不是他先想到的,下文有论及)
此外,不单这个项目毫无价值,下载BicaVM后我还愕然发现,该项目作者居然在BicaVM项目中要求使用Python运行服务…… 你,你玩Javaer呢?!
去看看他的webserver文件夹吧,可以说已经把BicaVM与Python绑死在一起了。这多像一个Java Byte
Code被翻译为JavaScript后(其实就是翻译String,然后解析为JS),再由JS向Python服务器发送请求处理Java代码的——
“Python马甲”啊!(PS:BicaVM所谓的JNI接口未来100%就是这样,除了JS能执行的,一律让Python服务器按照请求去访问某接
口,再把执行结果返回给客户端)
借用香港江湖片的名词,这简直就是“小弟”Java向“话事人”JavaScript求援,再由“话事人”JavaScript找到“龙头”Python求帮,最后由龙头大哥Python亲自出面帮Java小弟“摆平”问题的一系列标准动作。
额滴神啊,堂堂“编程兵器谱”排名第一位的Java,居然要向Python“摇尾乞怜”?!别的先不说,既然已经用JS解释JVM了,你又何苦不直接用
Java服务器运行你的演示程序呢?楞把Python做为BicaVM运行的容器,你让吾辈Java程序员情何以堪啊?!欺负我们搞Java的没活人了
吗?!从来就有Jython存在的理由,也从来就没有Pava存在的必要!
归根结底,用JS跑执行JVM行不行?行。解释字节码行不行?也行,怎么会不行?不过,还是等JavaScript自己先能编译成机器码后再说吧。
但上面所提及的,也无外是皮毛中的皮毛,真正让小弟深恶痛绝的事情,还要从下面两个项目讲起。
JSVM(JavaScript Virtual Machine)项目
JSVM。路过的大家有谁听说过这个项目没有?我估计2008年以前学编程的朋友估计有的听说过,有的没听说过,而2008年以后出来混的恐怕就凤毛麟角
了,小弟这里也不强求。总之,这是一个由国人万常华(wch3116)在2003年搞出来的,结构上仿照标准Java,原理上酷似于BicaVM的开源项
目(第一版最像,JSVM2差点,当然,正确的语序应该是BicaVM酷似JSVM)。
一句话,对比BicaVM而言,JSVM的实用性比BicaVM强太多了。
要知道,JS的语法结构本就与Java非常近似,如果按照JSVM的思路整合到一个统一的OOP框架下,那么结合当今的HTML5风潮,实在是大有可为。
可惜这么好的东西,不但没多少人帮助发展,更可恨当年还有几个拉便宜手说便宜话的假牛出来捣乱,结果闹得该项目“无疾而终”!实在是可惜,可恨,可怒,可
恼,可叹!
而让我恨得牙根发痒的,是我在某网站的BicaVM文章评论中,又看到了这样的说法:
国内没人才?我就呸!倒退十年国内就有这样的人才,我敢拿人头保证,绝对是先有JSVM后有BicaVM(虽然两者实现上有差别,但原理并无二致,都是结
构上的JS仿Java,而且JSVM直接使用原生JS(当然,也有自己的JSC语法甚至允许自由扩展),不模拟“完整版Java”绝对效率更高),可结果
呢?只因JSVM作者是某国人,空有人才,却很难遇人识才,最后更被归结到“不是人才”的那群里去了。小弟不知道JSVM的作者还在不在人世(应该还在吧
-_-),如果您恰巧看到本文,小弟这里顺便跟您说一声“我佩服您,您在十年前就搞出来的东西,洋人十年后才做出来!才被某些国人夸!”
公道自在人心,大家有空时可以结合2004年的JSVM旧文,再结合当前的BicaVM,也比较一下国内对中西同性质,不同效率项目(明显JSVM更快)的不同评价与讨论的主要方向吧。
PS:个人始终喜欢JSVM第一版,也就是高仿Java结构的那版,后来的JSVM2或许因前版性能被某些闲人诟病,于是作者牺牲了太多Java特性而搞了JSVM2,改的已经不像Java类库,更贴近JQuery之类,也因此失去了原有的优良特性,遗憾。
说完了国内的,小弟再来介绍介绍国外的“不知名”JVM项目——Avian,这是一个非常精巧的JVM虚拟机项目。Avian最大的特征就在于,可以构建不足1MB的完整Java应用,且无需额外的JRE。
小弟粗略归纳了一下Avian的要素,总结为如下四点。
1、avian基于OpenJDK构建,代码结构上与标准Java如出一辙,没有丝毫例外存在。
2、avian默认不支持AWT/Swing,SWT等图形库(但可以引入,比如作者的示例中就引入了SWT库),仅有io、lang、net、nio、
security、text、util这七个标准Java工具包被预装(近似于JavaME中CVM的实现)。因此代码量相当之小。七个包的Java源码
累积仅400多KB,压缩后简直就是“微缩景观”。某种意义上说,用avian写Java病毒也没问题(不用图形库,连微型虚拟机带class压缩后超过
不过300KB)。
3、avian微型JVM默认支持Linux、Mac OS、Windows三种环境的运行及编译。不过因为开源,从技术角度看移植到Android、iPhone等平台未尝不可(如果微软WP向普通用户开放C/C++的支持,那么也一样)。
4、当然,avian目前的缺点也有不少,比如本身没有提供自执行的启动方式,仅能通过C/C++代码调用main函数启动,需要用户对C/C++有初步
了解,纯Java技术员难以上手。执行速度虽然并不比OpenJDK逊色(因为主体就是从中提取的,虽然作者替换了部分实现),但始终不同于标准JRE,
有存在隐患之风险,在更多示例出现前,商业恐怕还难以让人放心。
怎么样,这还算是好东西吧?但不是小弟说话张狂,我要不提Avian的名字,全中国Java程序员有一个算一个,知道这项目者,能“他XYZ的”超过1000人吗?
如此实用的东西,在某国却和JSVM一样,极少有人理会,可洋人丢出来个垃圾,倒真有不少起哄帮腔的。难怪海外会有一小撮人说:“某国人干事,非得把世界上所有错误的方式都尝试遍了,才可能找到正确的那项选择”。
——————————
目睹此情此景,我,真替某国的某些程序员感到悲哀。
cnBeta 已经入驻豌豆荚啦,扫描左侧的二维码就可以在豌豆荚关注我们。豌豆荚,一个最懂应用的应用商店,发现无数好应用。
[责任编辑:ugmbbc]
-5-4-3-2-1012345
当前平均分: 打分后显示
-5-4-3-2-1012345
当前平均分: 打分后显示}

我要回帖

更多关于 javascript插件编写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信