2011-10-18 9 views
1

lib(Beard.js)がjavascriptテンプレートエンジンHamlをサポートするようにしようとしていたときに非常に奇妙な問題が発生しました。IE8で非常に奇妙なこと..定義された変数が「未定義」と認識される

Hamlを正しく読み込むことができませんでした。私はコードを追跡し、Hamlがページにロードされたことがないことを確認します。たくさんの試行錯誤の後、私はそれがうまく動作するようにした。私が見つけた変なものがある:起源HAMLのlibに

、それは次のとおりです。

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

-------------- UPDATE ---------- ----- Haml.jsで

、それは次のとおりです。

var Haml; 

(function(){ 
    ... 

    Haml = function Haml(){ ... } 

    ... 
}()); 

私はJavaScriptで推測、声明 "機能HAML(){}" HAMLローカルVARます。しかし、なぜFirefoxでHamlを正しく読み込むことができないのですか?& Chrome ???

+8

IE8は愚かです.... –

+0

ただ真実を語ってください。 –

+0

@Mahnax - IE 8が他のブラウザと異なる理由とECMA-262との矛盾点について、あなたの説明は何ですか?もしあなたがそれを持っていなければ、他のブラウザが "愚か"ではないことをどのように知っていますか? – RobG

答えて

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

このコードはIE 8でエラーが発生しません。 Firefoxや他の人に機能未定義IEでを示し

alert(typeof Haml); 

:あなたは、あなたの質問に欠けている部分には、以下の文です。

HAMLへの割り当てがという名前の関数式である(名前は任意)とはい、IEは他のブラウザにはない、名前と現在のスコープで変数を作成します。

+3

確かに矛盾します。 – davin

0

グローバルスコープで定義されているように自動的に認識されるべきではありませんか?

そのコード自体がグローバルスコープにある場合のみ。それが関数の一部である場合、varはその関数にのみスコープします。

+0

私は知っています。物事は 'var Haml'はグローバルスコープにあります。私はHamlが 'Haml = blah blah'でグローバルな 'Haml'を参照すべきだと思いますが、真実は私がwindow.Hamlを明示的に宣言する必要があることです。それが私を混乱させます。 –

+0

元のコードをチェックアウトすることができますhttps://github.com/creationix/haml-js –

+0

@ LiangliangZheng:http://jsfiddle.netで失敗していることを表示できますか?ありがとう。 – alex

5

この問題は、という名前の関数式という名前のJScript(IE8までのバージョン)に関連しています。そのため、名前付き関数式は関数宣言(関数式と同様に)として解析され、局所変数Hamlをローカルスコープに自動的に持ち上げます。その後、Haml = function(){}を設定しましたが、ローカルスコープに間違ってリークしたため、ローカルという変数をJscriptがその識別子で検出するため、グローバルHamlにはなりません。したがって、ローカルHamlが正しく設定されている間は、グローバルなものには決して到達しません。

この詳細については、hereをお読みください。

関連する問題