在IE8中非常奇怪。定义的变量被识别为'undefined'

时间:2011-10-18 00:40:52

标签: javascript internet-explorer-8

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

无法正确加载Haml。我查了下代码,发现Haml从未被加载到页面中。经过大量的尝试和失败,我碰巧使它成功。我发现的奇怪之处是:

在起源Haml lib中,它是:

var Haml;

(function(){
    ...

    Haml = function(){ ... }

    ...
}());

我将代码更改为:

var Haml;

(function(){
    ...

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

    ...
}());

然后它有效..

WHY ??? Haml不应该按照全球范围内的定义自动识别吗?

环境 - IE8
Haml.js - https://github.com/creationix/haml-js
Bear.js - https://github.com/jspopisno1/Beard

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

在Haml.js中,它是:

var Haml;

(function(){
    ...

    Haml = function Haml(){ ... }

    ...
}());

我猜在javascript中,语句“function Haml(){}”使Haml成为局部变量。但是,为什么Haml可以正确加载到Firefox&铬????

3 个答案:

答案 0 :(得分:5)

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

您可以阅读更多here

答案 1 :(得分:3)

> var Haml;
> (function(){
>     ...
>     Haml = function Haml(){ ... }
>     ... 
> }());

该代码不会为我在IE 8中抛出任何错误。您在问题中缺少的部分是以下声明:

alert(typeof Haml);

在IE中显示 undefined ,在Firefox等中显示 function

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

答案 2 :(得分:0)

  

不应该按照全局范围内的定义自动识别Haml吗?

仅当该代码本身位于全局范围内时。如果它是函数的一部分,var将仅将其范围限定为该函数。