Javascript IE8中非常奇怪的事情。。定义的变量被识别为';未定义';
当我试图启用一个lib(Beard.js)来支持javascript模板引擎Haml时,出现了一个非常奇怪的问题 无法正确加载Haml。我跟踪了代码,发现Haml从未加载到页面中。经过多次尝试和失败,我碰巧成功了。我发现的奇怪的事情是: 在origin Haml lib中,它是:Javascript IE8中非常奇怪的事情。。定义的变量被识别为';未定义';,javascript,internet-explorer-8,Javascript,Internet Explorer 8,当我试图启用一个lib(Beard.js)来支持javascript模板引擎Haml时,出现了一个非常奇怪的问题 无法正确加载Haml。我跟踪了代码,发现Haml从未加载到页面中。经过多次尝试和失败,我碰巧成功了。我发现的奇怪的事情是: 在origin Haml lib中,它是: var Haml; (function(){ ... Haml = function(){ ... } ... }()); 我将代码更改为: var Haml; (function()
var Haml;
(function(){
...
Haml = function(){ ... }
...
}());
我将代码更改为:
var Haml;
(function(){
...
window.Haml = function(){ ... }
...
}());
那就行了
为什么???Haml不应该被自动识别为在全局范围内定义的吗
环境-IE8Haml.js-
Bear.js- --------------更新--------------- 在Haml.js中,它是:
var Haml;
(function(){
...
Haml = function Haml(){ ... }
...
}());
我猜在javascript中,“function Haml(){}”语句使Haml成为本地变量。然而,为什么在Firefox和Chrome中可以正确加载Haml
Haml不应该被自动识别为在全局范围内定义的吗
只有当代码本身在全局范围内时。如果它是一个函数的一部分,var
将只对该函数进行范围限定
> var Haml;
> (function(){
> ...
> Haml = function Haml(){ ... }
> ...
> }());
Haml不应该被自动识别为在全局范围内定义的吗
只有当代码本身在全局范围内时。如果它是一个函数的一部分,var
将只对该函数进行范围限定
> var Haml;
> (function(){
> ...
> Haml = function Haml(){ ... }
> ...
> }());
这段代码对我来说不会在IE8中抛出任何错误。您在问题中缺少的部分是以下陈述:
alert(typeof Haml);
显示IE中未定义的功能,以及Firefox和其他浏览器中未定义的功能
Haml的赋值是一个命名函数表达式(名称是可选的),是的,IE将在当前作用域中创建一个名为的变量,其他浏览器不会
这段代码对我来说不会在IE8中抛出任何错误。您在问题中缺少的部分是以下陈述:
alert(typeof Haml);
显示IE中未定义的功能,以及Firefox和其他浏览器中未定义的功能
Haml的赋值是一个命名函数表达式(名称是可选的),是的,IE将在当前作用域中创建一个名为的变量,其他浏览器不会。问题与JScript(在IE8之前的版本中)有一个bug有关,命名函数表达式会泄漏到封闭的作用域中。因此,命名函数表达式被解析为函数声明(以及函数表达式),从而自动将局部
Haml
变量提升到局部范围。然后,设置Haml=function(){}
,但这不会导致全局Haml
,因为JScript会找到带有该标识符的局部变量,因为它错误地泄漏到局部范围。因此,虽然本地Haml
设置正确,但永远无法到达全局
您可以了解更多信息。问题与JScript(在IE8之前的版本中)存在一个错误有关,命名函数表达式泄漏到封闭范围中。因此,命名函数表达式被解析为函数声明(以及函数表达式),从而自动将局部
Haml
变量提升到局部范围。然后,设置Haml=function(){}
,但这不会导致全局Haml
,因为JScript会找到带有该标识符的局部变量,因为它错误地泄漏到局部范围。因此,虽然本地Haml
设置正确,但永远无法到达全局
关于这一点,你可以读更多。IE8很愚蠢……只是说实话。@Mahnax-你对IE8与其他浏览器不同的原因以及它与ECMA-262不一致的原因有何解释?如果你没有,你怎么知道不是其他浏览器“愚蠢”?@RobG给你一个@RobG我每天都使用IE8和Safari 5。Safari不仅在各个方面都表现得更好,而且看起来也更好。IE8很愚蠢……说实话。@Mahnax-你对IE8与其他浏览器不同的原因以及它与ECMA-262不一致的原因有何解释?如果你没有,你怎么知道不是其他浏览器“愚蠢”?@RobG给你一个@RobG我每天都使用IE8和Safari 5。Safari不仅在各个方面都表现得更好,而且看起来也更好。我知道。问题是‘var Haml’在全球范围内。我认为“Haml=blah-blah”中的Haml应该指的是全局的“Haml”,但事实是我需要显式地声明window.Haml。这就是让我困惑的地方。。我想我发现了问题。。但我还是很困惑,我知道。问题是‘var Haml’在全球范围内。我认为“Haml=blah-blah”中的Haml应该指的是全局的“Haml”,但事实是我需要显式地声明window.Haml。这就是让我困惑的地方。。我想我发现了问题。。但仍然困惑