当我尝试启用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&铬????
答案 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
将仅将其范围限定为该函数。