标准参考

函数声明和函数表达式

定义一个函数有两种途径:函数声明和函数表达式。

函数声明:
function Identifier ( FormalParameterList

opt

 ) { FunctionBody }
函数表达式:
function Identifier

opt

 ( FormalParameterList

opt

 ) { FunctionBody }

ECMAScript 根据上下文来区分函数声明和函数表达式,假设 "function test(){}" 是一个表达式的一部分,它就是一个函数表达式,否则它就是一个函数声明。

关于函数声明和函数表达式的更多信息,请参考 ECMAScript 规范 13 Function Definition 中的内容。

标识符

在 ECMAScript 中,变量名、对象的属性或方法名都是标识符,标识符可以包含英文字母、数字、美元符号 '$' 和下划线 '_',但不能以数字开头,不能是保留字。

换句话说,'+','.' 等符号是不能出现在标识符中的。

关于标识符的更多信息,请参考 ECMAScript 规范 7.6 Identifier Names and Identifiers 的内容。

问题描述

IE 的函数声明和函数表达式的实现与 ECMA 规范都有出入。

在 IE 中:
函数声明中的标识符允许是一个包含 '.' 运算符的表达式。(在绑定事件时,可以将事件名前的 '.' 替换为 '::'。 )
函数表达式中的标识符则可以在该函数外部被访问。

造成的影响

依赖 IE 的上述“特性”编写的代码,在其他浏览器中将不能按照预期的方式执行。

例如以 'function window.onload() {}' 形式定义的事件处理函数仅在 IE 中有效,在其他浏览器中将报语法错误。

受影响的浏览器

IE6 IE7 IE8  

问题分析

1. 函数声明中的标识符允许是一个包含 '.' 运算符的表达式。(在绑定事件时,可以将事件名前的 '.' 替换为 '::'。 )

分析以下代码:

function A(){}
function A.prototype.b(){}
var a=new A();
alert(typeof a.b);

本例中,第二个函数声明的标识符是非法标识符,它包含了 '.' 运算符。

各浏览器表现如下:

IE6 IE7 IE8 其他浏览器
function 浏览器报错(语法错误)

可见:以上写法只有 IE 支持。

2. 函数表达式中的标识符则可以在该函数外部被访问。

分析以下代码:

var a=function b(){};
alert(typeof b);

根据 ECMA 规范中的规定,以上函数表达式中的标识符 b 将仅在该函数的内部可以被访问,即 b 仅在该函数的作用域内有效,外部无法访问。

各浏览器表现如下:

IE6 IE7 IE8 其他浏览器
function undefined

可见:IE 没有遵循规范,函数表达式中的标识符在该函数外围的作用域内也可以访问。

注:本文部分内容参考了文章:Named function expressions demystified(中文翻译:命名函数表达式探秘)中的内容。

解决方案

避免使用 IE 的这些“特性”,以保证兼容所有浏览器。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6
Chrome 4.0.302.3 dev
Safari 4.0.4
Opera 10.51
测试页面: ...
本文更新时间: 2010-07-02

关键字

Named Function Declaration Expression 函数 声明 表达式

转载

http://w3help.org/zh-cn/causes/SJ9001

IE6 IE7 IE8 的函数声明和函数表达式的实现与其他浏览器有差异的更多相关文章

  1. JS代码判断IE6,IE7,IE8,IE9的函数代码

    JS代码判断浏览器版本,支持IE6,IE7,IE8,IE9!做网页有时候会用到JS检测IE的版本,下面是检测Microsoft Internet Explorer版本的三种代码 做网页有时候会用到JS ...

  2. IE6 IE7 IE8(Q) 不支持 JSON 对象

    标准参考 JSON 是一种数据交换格式,RFC 4627 对 JSON 进行了详细描述. 根据 ECMA-262(ECMAScript)第 5 版中描述,JSON 是一个包含了函数 parse 和 s ...

  3. [转载]使用兼容ie6 ie7 ie8 FF的text-overflow:ellips

    使用兼容ie6 ie7 ie8 FF的text-overflow:ellipsis超出文本显示省略号来代替截取函数更有利于seo,如果使用截取函数,源代码中的标题是显示不完整的,即便是在title属性 ...

  4. IE6/IE7/IE8/Firefox/Chrome/Safari的CSS hack兼容一览表

    浏览器兼容问题一直是前段开发工程师比较头痛的问题,熟悉了里面的规则也就变得简单了,这里有一份资料可以分享给大家,大家平时开发过程中遵循这个规律的话,会变得轻松多了: 各浏览器CSS hack兼容表: ...

  5. javascript 函数声明与函数表达式的区别

    先看一段代码 var f = function g() { return 1; }; if (false) { f = function g(){ return 2; }; } alert(g()); ...

  6. 如何让低版本的IE浏览器(IE6/IE7/IE8)支持HTML5 header等新标签

    html5提供的一些新标签(article,aside,dialog,footer,header,section,footer,nav,figure,menu)使用起来非常的方便,但是低版本的IE浏览 ...

  7. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法--(转)

    如有雷同,不胜荣幸,若转载,请注明 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了boot ...

  8. 让IE6/IE7/IE8支持HTML5标签的js代码

    让IE(ie6/ie7/ie8)支持HTML5元素,我们需要在HTML头部添加以下JavaScript,这是一个简单的document.createElement声明,利用条件注释针对IE来调用这个j ...

  9. 转载------让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法

    本文是转载及收藏 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在c ...

随机推荐

  1. installation and configuration of OpenCV4Android SDK

    http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html#running-opencv ...

  2. android异步加载图片

    import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; impo ...

  3. javaScript初学者易错点

    大家好,这是我在博客园写的第一篇博文.作为一名前端开发初学者,由于经验不足,水平有限,在做项目的过程中总会遇到这样或那样的问题,每每这时候,我都比较喜欢到博客园这里来寻求解决方案,结果也总是能找到满意 ...

  4. 使用Gson解析复杂的json数据

    Gson解析复杂的json数据 最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的jso ...

  5. [转]c/c++输入函数

    最全输入函数 c/c++ 一: c=getchar(); 功能:读入一个字符 说明:调用此函数时要求在程序的第一行有预编译命令:#include<stdio>,不过在做c++时 有#inc ...

  6. 解决docker中DNS查询的问题

    I got a dns error that i can not access dns server, that caused by : /etc/resolv.conf you can find t ...

  7. Allegro16.3约束设置

    差分对的约束设置 第一步,差分对的设置 差分对的设置有很多方法,下面介绍两种最常用的方法. 1. 点击菜单Logic→Assign Differential Pair... 弹出以下对话框. 点击你想 ...

  8. Windows Myeclipse 10 安装 Perl 插件

    1.首先安装 windows 下的 perl 环境这里使用 active perl,选择最新版本 5.16.1下载地址:http://www.activestate.com/activeperl/do ...

  9. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  10. Android中的PopupWindow详解

      Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意 AlertDialog是 ...