`
jindw
  • 浏览: 513980 次
  • 性别: 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!

相关推荐

    spreadjs_复杂公式语义化-demo.zip

    "SpreadJS 复杂公式语义化-demo" 是一个基于 SpreadJS 库的示例项目,用于演示如何在 Web 应用中实现类似 Excel 的复杂公式处理和计算功能。SpreadJS 是一款强大的 JavaScript 表格控件,由 GrapeCity 公司开发,它...

    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...

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

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

    js2c#-js转换c#代码

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

    基于语义分析的恶意JavaScript代码检测方法.pdf

    基于语义分析的恶意JavaScript代码检测方法 本文提出了一种基于语义分析的静态检测模型,用于检测恶意JavaScript代码。该模型通过提取抽象语法树的词法单元序列特征,使用 word2vec 训练词向量模型,将生成的序列...

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

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

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

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

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

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

    JavaScript js基础学习 示例代码

    JavaScript js基础学习 示例代码JavaScript js基础学习 示例代码JavaScript js基础学习 示例代码JavaScript js基础学习 示例代码JavaScript js基础学习 示例代码JavaScript js基础学习 示例代码JavaScript js基础...

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

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

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

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

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

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

    语义分割fastapi前后端对接代码.zip

    前端通常会使用JavaScript库如jQuery或现代的React、Vue.js来处理用户交互,将图像数据通过AJAX或Fetch API发送到后端的API端点。 前端和后端之间的通信通常遵循RESTful原则,使用HTTP的POST请求来提交图像数据。...

    LUA-JS.zip_js lua.js_js调用 lua_lua JavaScript_lua调用js_lua转js

    JS和LUA交互,主要是JS和LUA交互实现模版,可以作为参考

    netscape.javascript.JSObject

    applet 调用js 所需包 JSObject.getWindow(this).eval("javascript:alert(111)");

    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解释器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 ...

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

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

    jsFormatter.js + htmlFormatter.js +

    1. **jsFormatter.js**: 这个文件通常是一个JavaScript代码格式化器,它的作用是将混乱的JavaScript代码整理成具有良好可读性的格式。它可能包含了缩进、换行、注释排序等功能,有助于开发者提高代码审查效率,保持...

Global site tag (gtag.js) - Google Analytics