Javascript IE8中非常奇怪的事情。。定义的变量被识别为';未定义';

Javascript IE8中非常奇怪的事情。。定义的变量被识别为';未定义';,javascript,internet-explorer-8,Javascript,Internet Explorer 8,当我试图启用一个lib(Beard.js)来支持javascript模板引擎Haml时,出现了一个非常奇怪的问题 无法正确加载Haml。我跟踪了代码,发现Haml从未加载到页面中。经过多次尝试和失败,我碰巧成功了。我发现的奇怪的事情是: 在origin Haml lib中,它是: var Haml; (function(){ ... Haml = function(){ ... } ... }()); 我将代码更改为: var Haml; (function()

当我试图启用一个lib(Beard.js)来支持javascript模板引擎Haml时,出现了一个非常奇怪的问题

无法正确加载Haml。我跟踪了代码,发现Haml从未加载到页面中。经过多次尝试和失败,我碰巧成功了。我发现的奇怪的事情是:

在origin Haml lib中,它是:

var Haml;

(function(){
    ...

    Haml = function(){ ... }

    ...
}());
我将代码更改为:

var Haml;

(function(){
    ...

    window.Haml = function(){ ... }

    ...
}());
那就行了

为什么???Haml不应该被自动识别为在全局范围内定义的吗

环境-IE8
Haml.js-
Bear.js-

--------------更新---------------

在Haml.js中,它是:

var Haml;

(function(){
    ...

    Haml = function Haml(){ ... }

    ...
}());
我猜在javascript中,“function Haml(){}”语句使Haml成为本地变量。然而,为什么在Firefox和Chrome中可以正确加载Haml

Haml不应该被自动识别为在全局范围内定义的吗

只有当代码本身在全局范围内时。如果它是一个函数的一部分,
var
将只对该函数进行范围限定

> var Haml;
> (function(){
>     ...
>     Haml = function Haml(){ ... }
>     ... 
> }());
Haml不应该被自动识别为在全局范围内定义的吗

只有当代码本身在全局范围内时。如果它是一个函数的一部分,
var
将只对该函数进行范围限定

> var Haml;
> (function(){
>     ...
>     Haml = function Haml(){ ... }
>     ... 
> }());
这段代码对我来说不会在IE8中抛出任何错误。您在问题中缺少的部分是以下陈述:

alert(typeof Haml);
显示IE中未定义的功能,以及Firefox和其他浏览器中未定义的功能

Haml的赋值是一个命名函数表达式(名称是可选的),是的,IE将在当前作用域中创建一个名为的变量,其他浏览器不会

这段代码对我来说不会在IE8中抛出任何错误。您在问题中缺少的部分是以下陈述:

alert(typeof Haml);
显示IE中未定义的功能,以及Firefox和其他浏览器中未定义的功能


Haml的赋值是一个命名函数表达式(名称是可选的),是的,IE将在当前作用域中创建一个名为的变量,其他浏览器不会。问题与JScript(在IE8之前的版本中)有一个bug有关,命名函数表达式会泄漏到封闭的作用域中。因此,命名函数表达式被解析为函数声明(以及函数表达式),从而自动将局部
Haml
变量提升到局部范围。然后,设置
Haml=function(){}
,但这不会导致全局
Haml
,因为JScript会找到带有该标识符的局部变量,因为它错误地泄漏到局部范围。因此,虽然本地
Haml
设置正确,但永远无法到达全局


您可以了解更多信息。

问题与JScript(在IE8之前的版本中)存在一个错误有关,命名函数表达式泄漏到封闭范围中。因此,命名函数表达式被解析为函数声明(以及函数表达式),从而自动将局部
Haml
变量提升到局部范围。然后,设置
Haml=function(){}
,但这不会导致全局
Haml
,因为JScript会找到带有该标识符的局部变量,因为它错误地泄漏到局部范围。因此,虽然本地
Haml
设置正确,但永远无法到达全局


关于这一点,你可以读更多。

IE8很愚蠢……只是说实话。@Mahnax-你对IE8与其他浏览器不同的原因以及它与ECMA-262不一致的原因有何解释?如果你没有,你怎么知道不是其他浏览器“愚蠢”?@RobG给你一个@RobG我每天都使用IE8和Safari 5。Safari不仅在各个方面都表现得更好,而且看起来也更好。IE8很愚蠢……说实话。@Mahnax-你对IE8与其他浏览器不同的原因以及它与ECMA-262不一致的原因有何解释?如果你没有,你怎么知道不是其他浏览器“愚蠢”?@RobG给你一个@RobG我每天都使用IE8和Safari 5。Safari不仅在各个方面都表现得更好,而且看起来也更好。我知道。问题是‘var Haml’在全球范围内。我认为“Haml=blah-blah”中的Haml应该指的是全局的“Haml”,但事实是我需要显式地声明window.Haml。这就是让我困惑的地方。。我想我发现了问题。。但我还是很困惑,我知道。问题是‘var Haml’在全球范围内。我认为“Haml=blah-blah”中的Haml应该指的是全局的“Haml”,但事实是我需要显式地声明window.Haml。这就是让我困惑的地方。。我想我发现了问题。。但仍然困惑