当我尝试启用一个库 (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/