IE6 IE7 IE8 的函数声明与函数表达式的落实和其余浏览器有差异

正规参照

函数声明与函数表达式

概念一个函数有半点种植途径:函数声明与函数表达式。

函数声明:
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