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

Lia*_*eng 1 javascript internet-explorer-8

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

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

在起源Haml lib中,它是:

var Haml;

(function(){
    ...

    Haml = function(){ ... }

    ...
}());
Run Code Online (Sandbox Code Playgroud)

我将代码更改为:

var Haml;

(function(){
    ...

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

    ...
}());
Run Code Online (Sandbox Code Playgroud)

然后它的工作..

为什么???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(){ ... }

    ...
}());
Run Code Online (Sandbox Code Playgroud)

我想在javascript中,语句"function Haml(){}"使Haml成为局部变量.但是,为什么Haml可以在Firefox和Chrome中正确加载????

dav*_*vin 5

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

你可以在这里阅读更多相关信息.