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



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

无法正确加载哈姆尔。我追踪了代码,发现Haml从未加载到页面中。经过多次尝试和失败,我碰巧让它工作了。我发现奇怪的事情是:

在起源 Haml lib,它是:

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

我将代码更改为:

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

然后它起作用..

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

环境 - IE8
哈姆尔.js - https://github.com/creationix/haml-js
熊.js - https://github.com/jspopisno1/Beard

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

在哈姆尔.js中,它是:

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

我猜在javascript中,语句"function Haml(({}"使Haml成为本地var。但是,为什么Haml可以在Firefox和Chrome中正确加载????

该问题与

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

您可以在此处阅读更多内容。

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

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

alert(typeof Haml);

在IE中显示未定义,在Firefox和其他版本中显示功能

对 Haml 的赋值是一个命名函数表达式(名称是可选的(,是的,IE 将在当前范围内创建一个带有该名称的变量,其他浏览器不会。

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

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

最新更新