`
jindw
  • 浏览: 509837 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

JS几处怪癖的语义

阅读更多
带ID的函数表达式:

var fn = function fnid(){};


按照ECMA262定义,上面这段脚本等价于:

with({fnid:null}){
  var fn = fnid = function(){};
}

注意:fnid在with外是不可见的,但是IE没有严格遵守ECMA规范(同样的情况发生在catch语法上)。在IE上相当于:
  var fnid = function(){};
  var fn = fnid;


在刚刚发布的JSA1beta上,还不能处理这个问题(新版本将这周内发布)。同时,鉴于这种语法在不同浏览器上表现不同,还是建议尽量避免使用(这点上,我个人还是更喜欢ie的方式)。


var语句:
太常用了,但是,没有注意还是很容易出问题。
var 用来声明全局或函数变量,但是,只是申明,重复申明也不能置空,范围是函数或者全局空间,位置在函数或脚本顶端,与块无关,这些与常用高级语言区别很大。

怪癖的代码
var vaiable =0;
function test(){
   variable =1;//别担心,不会改动全局变量vaiable
   //do ........
   var vaiable;//变量申明无顺序(一律置顶),只是赋值有顺序。
}




常见错误有:
var flag;//这里可能有人(包括我自己)喜欢自做聪明的利用一下变量的初始值undefined
while(!flag){//没准那个角落里面已经给当前函数内同名变量给赋值了就惨了
  //.....
}




分享到:
评论
2 楼 hax 2007-07-01  
btw,var的最大问题是他的作用域是函数,而不是block。例如下面的:

alert(x);
if (a = 1) {
  var x = 1;
} else {
  var x = 2;
}
alert(x);

js2引入了let,来替代var。
1 楼 hax 2007-07-01  
第一个问题是ie的bug!因为fnid的主要目的是为了函数内部递归调用之用,省得你写arguments.callee那么长。。。

至于说你更喜欢ie的做法,也许jscript团队的想法跟你一致。但是这不是它违背ecma规范的理由,否则他们就不能声称自己是ecma的实现。类似的问题还有{}和[]初始化的问题: var x = [1,2,3,]长度应该是3,但是jscript是4。var obj={a:1,b:2,c:3,}按照规范是合法的,jscrript会报语法错。

我建议jsa的最佳做法是:如果开启一个所谓的jscript兼容选项,就把function expression的fnid去掉,其内部的fnid替换成arguments.callee。

你最后一个代码段会发生问题的情况只是在这段语句之前已经有地方写了 flag = xxx了。这种情况确实少见,建议jsa给出warning!

相关推荐

    language-javascript-semantic, 面向 Atom的JavaScript语义高亮.zip

    在"language-javascript-semantic-master"这个压缩包中,通常包含以下几部分: 1. **源代码**:实现语义高亮功能的JavaScript和CSS文件,这些文件定义了如何解析JavaScript代码并应用相应的高亮样式。 2. **配置...

    语义化标签兼容IE8以上文件

    2. **定义元素**:对于不被IE8识别的语义化标签,`myIE8up.js`可能会创建这些标签作为JavaScript对象,并赋予它们相应的CSS类名,以便通过CSS进行样式设置。 3. **DOM操作**:文件可能包含将这些语义化标签插入到DOM...

    tern-lint, 用于验证javascript文件收集语义错误的Tern插件.zip

    tern-lint, 用于验证javascript文件收集语义错误的Tern插件 lint 这款软件可以验证javascript文件,收集语义错误。 它是 static 类型检查器像流 。 main linters JSHint like JSCS ESLint 的主要区别是,验证...

    编译原理语义分析

    例如,Python和JavaScript中,变量的类型可以在运行时确定,但编译器仍然需要进行类型检查以避免错误。 6. **错误检测**:语义分析不仅查找类型错误,还会查找其他类型的错误,如未声明的变量、未使用的变量、重复...

    基于语义分析的恶意JavaScript检测技术.pdf

    "基于语义分析的恶意JavaScript检测技术" 本文主要介绍了一种基于语义分析的恶意JavaScript检测技术,该技术可以对恶意JavaScript代码进行检测和分析,以保护Web应用程序的安全。 在互联网快速发展的今天,Web应用...

    vscode中的语法高亮和语义高亮(Syntax Highlight and Semantic Highlight)

    - **修改 Syntax Highlight 配置颜色**:通过设置不同 token 类型的 scope(如 `keyword.operator.arithmetic.js`),可以精确控制每个语法元素的颜色。例如,可以更改 JavaScript 中加号的显示颜色。 2. **语义...

    js2c#-js转换c#代码

    JavaScript(简称JS)是一种广泛用于前端开发的轻量级脚本语言,而C#则是一种面向对象的编程语言,常用于构建Windows桌面应用、游戏、服务端应用等。"js2c#"工具正是一个旨在帮助开发者将JavaScript代码转换为C#代码...

    kernelcss非侵入性语义化css和JavaScript框架

    kernel.css 是一个非侵入性的语义化CSS和JavaScript框架,旨在提高网页开发的效率和可维护性。这个框架的核心理念是将样式和行为分离,同时保持代码的清晰和易于理解,这对于大型项目的开发尤其重要。 在CSS方面,...

    语义分析的编译的分析的原理

    语义分析主要关注以下几个方面: 1. **类型检查**:确保程序中的表达式、变量和操作符之间的类型匹配。例如,检查整型变量与浮点型变量的相加是否合法,或者函数调用时参数类型与声明的函数原型是否一致。 2. **上...

    语义网:用于使用语义网技术构建应用程序的一组JavaScript库和实用程序

    在这个领域,JavaScript库和实用程序扮演着关键角色,它们为开发人员提供工具来创建能够理解、推理和操作语义数据的应用程序。在给定的标题和描述中,我们可以看到一个专门针对这一目的的JavaScript项目,它是一个用...

    两个比较好用的Eclipse中javascript插件jsEditor jsEclipse

    总的来说,jsEditor和jsEclipse都是Eclipse中不可或缺的JavaScript开发工具,它们通过丰富的特性和服务,帮助开发者提高生产力,降低出错概率,使JavaScript编程更加轻松愉快。无论你是新手还是经验丰富的开发者,都...

    基于elinput打造的语义化版本输入框

    以下几点是`el-semver-input`的主要特点: 1. **格式校验**:组件内部实现了对输入值的实时校验,确保输入的版本号符合`主版本号.次版本号.修订号`的结构,每个部分只能包含非负整数。 2. **错误修正**:如果用户...

    js酒店价格日历_js门票价格日历_javascript价格日历

    此程序是javascript和php开发,提供酒店、门票订购的价格日历和点击日历订购产品功能。详细请参考驴妈妈 酒店和门票的价格日历。 ...style 样式和js文件 说明: 此程序中js是驴妈妈上的,我做了些修改...不足之处请反馈。

    JavaScript应用实例-adb5037常用命令.js

    JavaScript应用实例-adb5037常用命令.js

    JavaScript解释器js.js.zip

    js.js 是一个用 JavaScript 编写的 JavaScript 解释器 Instead of trying to create an interpreter from scratch, SpiderMonkey is compiled into LLVM and then emscripten translates the output into ...

    json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】

    json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】。JavaScript中解析JSON的js包,页面中引入json3.js,即可使用。 使用方法:JSON.parse(str), JSON.stringify(obj) 更多详情请参考博文: ...

    基于JavaScript和LR1分析的C语言智能错误处理编译器前端,包括词法分析器和语法分析器不包括语义分析.zip

    该压缩包文件包含了一个使用JavaScript实现的C语言智能错误处理编译器的前端部分,主要涉及词法分析和语法分析这两个关键步骤,但不涵盖语义分析。让我们深入了解一下这些概念及其在编译器设计中的作用。 **词法...

    js 实现 在JavaScript运行VBScript函数

    js 实现 在JavaScript运行VBScript函数! 值得下载看看!资源免费,大家分享!!

    delphi与JavaScript进行交互,获取JS端返回值

    本文将深入探讨如何在Delphi环境中与JavaScript进行交互,特别是如何从JavaScript端获取返回值,这在实现桌面应用与Web内容的集成时非常有用。 Delphi是一种流行的面向对象的 Pascal 编程语言,它提供了丰富的库和...

    鬼鬼js调试工具,用于进行js调试功能

    鬼鬼JS调试工具(Ghost.js Debugger)是一款专门为JavaScript开发者设计的调试工具,旨在提供高效、直观的调试体验。以下是关于鬼鬼JS调试工具的内容概要、适用人群、适用场景及目标: 内容概要 鬼鬼JS调试工具主要...

Global site tag (gtag.js) - Google Analytics