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

标签 javascript internet-explorer-8

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

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

在原始 Haml 库中,它是:

var Haml;

(function(){
    ...

    Haml = function(){ ... }

    ...
}());

我将代码更改为:

var Haml;

(function(){
    ...

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

    ...
}());

然后就可以了..

为什么???难道 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&Chrome中可以正确加载????

最佳答案

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

您可以阅读更多 here .

关于javascript - 在 IE8 中非常奇怪的事情。定义的变量被识别为 'undefined',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7801246/

相关文章:

javascript - 如果隐藏了父元素,则 Google 登录按钮不会在 Firefox 中加载

javascript - 选择.js : automatically select freshly created value in ajax callback

jquery - IE8 + Jquery ajax 调用从 dJango 给出解析器错误 : for json data which seems valid in Firefox

html - IE8 select 指针渐变不显示

javascript - SCRIPT5007 : The value of the property onclick ="JavaScript:functionName(' name', '2' 、 '0' ) 为 null 或未定义,不是 Function 对象(ie8)

javascript - Web 应用程序翻译不适用于所有浏览器

javascript - 如何让 inputRef 从 <Textfield> 返回 &lt;input&gt; 元素?尝试了我能想到的一切,它仍然是空的

javascript - Nodejs 全局函数

html - 在 IE9 中调整图像像素化

html - 如何让文本始终位于 td 的左上角?