- 浏览: 508442 次
- 性别:
- 来自: 初到北京
最新评论
-
javamonkey:
有点老了,有个Teb测试,这个性能测试很标准http://gi ...
几款模板引擎的性能对比 -
greenlaw110:
xuyao 写道sdh5724 写道xuyao 写道很好,nn ...
几款模板引擎的性能对比 -
sefier:
不知道你看的是哪个版本的,现在所看到的版本和你所描述的不一致, ...
Facebook XHP 调研 -
javatar:
我觉得从通用语言去思考可能更有意思,满足八封其实就是一个完备集 ...
五行通天地 八卦定乾坤--打算按照先天八卦的形制重构Lite模版引擎的指令集 -
luo2pei4321:
MVEL的官方例子里面好像只支持Integer和String两 ...
表达式引擎JSEL介绍
准备编写JSI的外围元素,先整理一下编码风格和一些约定,欢迎大家讨论。
基本风格
* 基本参照Java代码风格。
1. 驼峰式命名(单词无连接字符,单词首字母大写,其余小写);
2. 类的首字母大写(eg:MyClass);
3. 变量名,方法名,成员名首字母小写(eg:name,value,targetObject);
4. 单例对象遵循类的命名方式(eg:GlobalController);
5. 常量全部大写,下划线分割单词(eg:APPLICATION_ID);
参考:http://java.sun.com/docs/codeconv/
* 变量所用单词尽量不用缩写。
缩写的单词容易造成语意的不明,不易阅读,而且容易造成争议。
编码约定
* 不要随意扩展原始对象。
自Prototype
起,扩展原始对象似乎成了一个时髦的东西,大家都喜欢用。我承认他的便捷,但是请不要滥用,尽量做到有标准可循(比如为IE5扩展
Array.prototype.push),原始对象就这么几个,万一那天碰到两个人写的代码,行为不一致,那麻烦就大了。
* 不要扩展Object.prototype。
这个地雷貌似已经被头大牛踩到,但是你不要踩,谁踩到他,你就和他割席断交吧。
* 不要盯上对象的constructor属性。
constructor属性是非常不可靠的,很容易也经常被改写,而且经常被改写到Object对象[MyClass.prototype = {...}],能后你以为是你的构造器,动之,能后天下大乱。
* 不要写那些中看不中用的集合。
不要模仿Java 集合API,去写什么 HashMap,ArrayList。JavaScript不相信这些,这个世界简单才是硬道理。
* 在结构中始终使用区块。
莫偷懒,省略区块(即{ })会引发不经意的错误和麻烦。即使只有一句,也老老实实写上:
* 单例模式直接使用对象申明。
我们不需要那个不中用的构造函数, 不如直接来个对象申明,直接定义属性。
* 变量名就是最好的文档。
不要担心变量名称的长度,他们只是一个符号,符号的意义在于表明变量的意义,而大小的事就交给压缩工具吧。比如,可以使用thisPackage,targetPackage;而不要用pkg1,pkg2。
* 表达式中赋值需要明确注释。
直接在表达式中赋值可以使代码紧凑,但会降低程序可读性,应尽量避免,但是对于一些关键元素,可以采用(压缩/优化考虑),但必须明确注释。
* 目录名以"/"结尾。
JSI内核中,有一些地方需要记录目录地址。这里我们统一以“/”结尾。
* 不要使用原始类型的对象量。
原始对象有些诡异的地方,如。
new String("test") != new String("test");
if(new Boolean(false)){
alert("执行到")
}else{
alert("未被执行")
}
对外接口可以考虑兼容,但是内部元素,不考虑,内部也不要使用这些对象。
* 杜绝变量悬空现象
不要出现:
if (!window.Element){
var Element = new Object();
}
改成:
var Element = window.Element || new Object();
这段代码来自大名鼎鼎的Prototype,这里没错,但是如果被拷贝到某个函数内,问题就大了,有此类问题的脚本,放在JSI中装载,也会存在问题。
一些诡异的技巧
* {}就是Map
哪简单对象当map是个非常方便的地方,缺点是key都被转化成string。但是大多数情况下还是够用的,简单就好,没必要复杂化。
* []用作LinkedHashMap
使用数组保存键的顺序,对象存储键的值,基本可以等价于LinkedHashMap结构。缺点是有上,同时,length不能为键。
* 使用constructor == String代替typeof
上面说到constructor不可靠,是的,但是constructor用来代替typeof,一般来说更可靠了。还可以同时做好对象类型和值类型的兼容。
* 巧用与或。
if(fn){
fn();
}
-->
fn&&fn();
慎用动态元素
* eval
eval的性能问题到不是主要的,主要理由依然是他的动态性,容易给程序带来不稳定因素。
* with
少用with,主要不是他的性能问题,其实with的性能问题并不太明显,但是他容易给程序带来不稳定因素。
* execScript
类似eval,ie上通行,不同之处在于他是一个上下文无关的eval,传入的脚本直接在全局上下文执行。
* document.write
当打印一段脚本标签时,近似等价与execScript
* new Function
不仅是动态元素,他同时还有一个上下文短路问题。
* 少用属性。
属性虽然是面向对象的常用元素,但JavaScript?属性的动态性太强,不便自动优化处理;同时属性的使用,将产生更多不稳定的状态,虽然貌似易于阅
读,却增加了程序的复杂性。实际编码中应该谨慎。常量性质的私有属性不要出现,能用变量的地方也不要随意升级为属性。
* window.xyz
有些人习惯用这个来申明全局变量,或者干脆不申明, 那么,改掉你的坏习惯。
评论
2, 有没有考虑过用xml作为语言基础, xml天生的对象式描述语法, 省去了很多不必要的定义, 声明.
两次new String()得到两个(不同的)对象,内存地址当然不相同。
2. if(new Boolean(false)){
alert(”执行到”)
}else{
alert(”未被执行”)
}
new Boolean()得到的也是对象,在if里相当于true,当然“执行到”,你可以试一下: if(new Boolean(false).valueOf())
既然javascript没提供scope对象以外的私有方式 还非要用不是很奇怪吗?
赞成这个观点。
在私有属性上,使用_前缀。
关于私有方法,我已经养成了另外一个习惯,那就是使用内部方法(全局元素的形式,但不在包定义文件中注册)。
也不单是方法,一切常量性质的私有属性都可以使用内部元素的方法做到真正的私有。
单是如果这个私有元素是个实例的变量,那就不适用了。
我记得eclipse源码最初都是用下划线做私有成员的前最,后来他支持对私有对象的不同着色,那个约定也就随之取消了。
当然这个故事,不一定在js ide上重演,只是,我个人已经养成了这个习惯了,不用下划线。
我们更关心的是最终公开元素的结构,私有的东西,个人愿意怎么干都行吧。
_var_
__var__
虽然比较难看,但是能够分清变量的作用域,避免泄漏
js作用域是通过closure控制是没问题的 私有完全可以做到
这种用奇怪名字避免重名的办法千万不要约定 约定的就容易冲突
自己可以规定一下
比如 喜欢钱的可以用这种 $_$var
_var_
__var__
虽然比较难看,但是能够分清变量的作用域,避免泄漏
* 杜绝变量悬空现象
不要出现:
if (!window.Element){
var Element = new Object();
}
改成:
var Element = window.Element || new Object();
这段代码来自大名鼎鼎的Prototype,这里没错,但是如果被拷贝到某个函数内,问题就大了,有此类问题的脚本,放在JSI中装载,也会存在问题。
我觉得都非常不错,但这个我觉得用逻辑运算符并没有用if那么明了,当然我觉得上面的代码或许改为:
var Element = window.Element;
if (!Element){
Element = new Object();
}
还有一点,不知道应不应该定义一下私有变量和函数的命名规则,比如用 __temp 或者 __temp__ 来命名呢?
听说出IE8了还没试啥样呢。
忘标注了 这个测试结果是ie8的ie7模式的结果
我最初犯的一个错误式,误以为delete式删除变量的,后来发现,delete只是用来删除属性,纠正下来以为万事大吉了,没想到还有这样没完没了,呵呵
谢谢各位的精彩补充
听说出IE8了还没试啥样呢。
<tbody>
<tr>
<td> </td>
<td>delete t</td>
<td>delete window.t</td>
</tr>
<tr>
<td>t="test"</td>
<td>成功</td>
<td>Exception</td>
</tr>
<tr>
<td>var t="test"</td>
<td>无效</td>
<td>Exception</td>
</tr>
<tr>
<td>window.t="test"</td>
<td>Exception</td>
<td>Exception</td>
</tr>
</tbody>
</table>
<p> </p>
<p>tmd 刚才没测 t="test" - -!</p>
var test="test";alert(delete test);//false
test="test";alert(delete test);//true
test="test";alert(delete window.test);//IE出错
window.test="test";alert(delete test);//IE出错
window.test="test";alert(delete window.test);//IE出错
看来IE对var、无var、window.的处理是分三种……
IE5.5/IE6/IE7/FF2/Opera9/Safari3都测了。公司要求这六种浏览器……
把这个代码贴到地址栏里测试吧:
javascript:try{alert(delete window.xyz)}catch(e){alert(e)}
有些时候window.xyz用来动态声明全局变量 不过有JSI的话当然就不需要了
delete window.xyz 是可以删掉的。问题是IE删不掉。因为在IE中window对象和所有DOM对象一样,无法用delete。
yes 就是指IE
IE5.5/IE6/IE7/FF2/Opera9/Safari3都测了。公司要求这六种浏览器……
有些时候window.xyz用来动态声明全局变量 不过有JSI的话当然就不需要了
delete window.xyz 是可以删掉的。问题是IE删不掉。因为在IE中window对象和所有DOM对象一样,无法用delete。
<p>以下代码写在<script>最外层,不要写在函数里,我们看看var的作用。</p>
<pre name='code' class='js'>var test="test";
alert(delete test);</pre>
<p> 显示"false"。</p>
<pre name='code' class='js'>test="test";
alert(delete test);//delete window.test也一样。</pre>
<p> 显示"true",test不存在了。</p>
<pre name='code' class='js'>window.test="test";
alert(delete test);//delete window.test也一样。</pre>
<p> 同上。</p>
<p>所以说使用var声明的是一个变量,不能用delete对其操作。但可以用window.test访问之,也可以省略window直接访问。</p>
<p>不使用var,其实是给window添加了一个属性,自然也可以用window.test访问之,也可以省略window直接访问。也可以用delete删除之。</p>
发表评论
-
JSA 发布一个新的预览版本
2009-07-27 01:15 1483主要功能是: 1。带上了原来的经典UI界面。 增加了一 ... -
CGI还是个不错的玩意
2009-06-20 18:52 998JSI的调试辅助程序目前提供有JavaServlet版本和ph ... -
用两句话来解释JSI是怎么隔离JavaScript变量冲突的
2009-06-01 17:08 1301“我还是一直没有明白jsi是怎么隔离名字空间的” 好,大家的 ... -
端午在家搞了一个基于JSI的脚本发布系统
2009-05-31 13:06 1353项目上线之前,脚本都要手动重新组合压缩。挺麻烦的,JSICDN ... -
把JSA部署在GoogleAppEngine上,迎接我的是一张笑脸^_^
2009-05-03 02:47 1028第一个无意的测试,结果打印出了一张笑脸^_^ 只是随便输的.真 ... -
关于JSI装饰引擎改进的一些想法
2009-02-16 18:29 907今天看到bellstar大侠发布的SUI,也看了一些设计及实现 ... -
水月镜花
2009-02-07 21:11 1006刚才cctv4在播放着《激情燃烧的岁月》。一些情节开始看着很有 ... -
韬光养晦 厚积薄发
2008-10-22 21:34 2095最近被反复问道,JSI还在继续吗? 开始感觉很诧异,后来想想也 ... -
脚本全局变量探测程序
2008-08-28 23:20 1659为了支持JSI包定义中的模式匹配(方便某些懒人)。我需要一个查 ... -
JSI 类库文件格式探讨
2008-08-05 20:08 2612在JSI中打包脚本类库。 目前只有jar方式,同时支持java ... -
使用中间数据格式优化前端模板性能的想法
2008-06-12 21:24 1813前端时间这里出现了不少讨论前端模板的帖子。 我还是原来的观点 ... -
JSA压缩Prototype1.6时,经常表现的一个错误
2008-05-07 21:15 2445开始发帖错误,我的测试不够严谨。 经过测试,IE也没有踩 ... -
发布一个JSI Example Project
2008-04-30 14:58 4036部署到Tomcat中,打开script目录,可以显示你当前sc ... -
给大家展示一下JSI文档工具和导出工具
2008-02-21 11:43 3660演示地址(目前只支持Firefox): http://www. ... -
JSI的延迟装载和异步装载过程的一些原理解释
2008-02-14 17:13 6420出自该贴的回复: http://www.iteye.com/t ... -
JSIDoc设计的两个失败点
2008-02-08 00:11 3670JSIDoc是我一年前开发的用来解析JS文档的纯客户端脚本程序 ... -
JSI的导入指令参数顺序调整意见征询
2008-02-07 17:20 7905改动 2.0方式: $import(path,callbac ... -
JSI2.1计划
2008-01-01 21:13 7122先回顾历史: JSI1(2006-2007)是个简单的框架,只 ... -
JSA 压缩JS时的常见问题
2007-12-30 16:08 42031。保留字滥用 如果你的脚本中存在某些保留字或者关键字属性甚至 ... -
脚本合并时混淆隔离的三个级别
2007-12-23 13:38 3529直接合并--传统方式 根据脚本依赖关系,组织好导入顺序,简单的 ...
相关推荐
JSI有隐式的名称空间,既有名称空间的好处,又没有名称空间的麻烦和性能损失,还可以方便重构(修改报名无需修改代码)。即:你的脚本放在哪个目录下,他就自动属于哪个名称空间 * 优化脚本组织 可以按包...
2. **example**:这个目录可能包含了一些示例代码或页面,用来展示JSI-full-2.0的功能和用法。开发者可以通过这些例子快速理解和学习如何使用这个项目。 3. **images**:存放图像资源的文件夹,可能包括logo、图标...
我们提供了培训和测试代码,以及经过训练的权重和用于JSI-GAN的数据集(train + test)。 如果您发现此存储库有用,请考虑引用我们的。 参考: Soo Ye Kim *,Jihyong Oh *和Munchurl Kim“ JSI-GAN:基于GAN的...
根据提供的信息,我们可以了解到这份文档是关于海尔液晶电视电源板(型号:0094001224B JSI-190419-050 JSI-220409-050)的原理图。这份原理图详细地展示了电源板的内部电路结构、元件布局及其连接方式等关键信息。...
在JavaScript的世界里,JSI(JavaScript Interpreter)是一个用于在运行时执行JavaScript代码的解释器,它为各种应用场景提供了便利,比如在嵌入式系统、服务器端或是其他非浏览器环境中运行JavaScript。"jsi-...
react-native-multithreading using使用JSI的React Native的快速简便的多线程处理。 安装npm install react-native-multithreading npx pod-i react-native-multithreading using使用JSI进行React Native的快速简便...
本文将详细解析海尔液晶电视电源背光板0094001274E JSI-320411原理图中的关键元件及其功能、电路设计思路与工作原理,帮助读者更好地理解该背光板的工作机制,并为可能遇到的问题提供诊断和维修方面的参考。...
JSI Wikifier OpenAPI规范 JSI Wikifier API文档存储库。链接文档: : SwaggerUI: ://jsi-eubusinessgraph.github.io/jsi-wikifier-api/swagger-ui/ 看完整规格: JSON YAML 警告:仅当Travis CI完成部署后,以上...
- **编译与运行时支持**:支持JS代码的编译和运行,提供高效的执行环境。 - **模板引擎**:提供模板语言,简化UI布局的编写,提高开发效率。 - **状态管理**:管理应用的状态,确保数据与视图的同步。 - **事件...
通过阅读和分析这些文件,你可以深入理解项目的工作原理,学习如何组织代码、如何实现特定功能,以及如何与其他开发者协作。此外,它还可能包含README文件,提供项目介绍、安装指南和使用说明。通过研究这样的项目,...
在Android开发中,自定义控件是提升应用用户体验和界面美观...通过查看和学习这些代码,你可以更好地理解如何将理论知识应用于实际项目中。在实践中不断探索和优化,你将能够创建出更加美观、功能丰富的自定义进度条。
该代码是开源的,并在 2.1 或更高版本下发布。 用法 强烈建议首先查看位于 的 jsi-examples 存储库。 简而言之,您需要像这样初始化 RTree: // Create and initialize an rtree SpatialIndex si = new RTree(); si....
eccl-jsi.github.io
Jsi是带有内置websocket-server,sqlite和C -extensibility的javascript -ish解释器。 | | | 快速开始下载适用于 / 的二进制文件: wget ...
在JSI-master这个压缩包中,我们可能找到了JSI的源代码和相关文档,这为我们提供了深入理解其工作原理的机会。源代码通常包含了实现空间索引的各种类和方法,包括但不限于以下组件: 1. **空间对象表示**:JSI需要...
javascript sfs多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加
在网页设计中,为了增加互动性和趣味性,有时会在页面底部添加一些动态元素,比如“跳动的小鱼”。... ...在`<head>`部分,我们将引入外部JavaScript文件,用于实现小鱼动画的效果。例如: ...接下来,我们创建一个名为`...
:thread: 使用JSI的React Native的快速简便的多线程处理。 安装 npm install react-native-multithreading npx pod-install 需要包括的react-native-reanimated版本。 您可以自己打补丁,也可以等到它发布后再...
通过React 5的MD5的JSI绑定,以极快的速度实现C ++实现。 确认它比在iPhone 11 Pro上使用快10倍,在Essential Phone上快8倍。 您可以在下查看基准测试。 安装 npm install react-native-quick-md5 用法 import { ...
正泰LQG-0.66型电流互感器PDF,