javascriptの奥義を初めて覗いたのはつかめないthis

4818 ワード

http://www.xue5.com/WebDev/JavaScript/693311.html
なぜこの文章があるのかはもちろん、最近の面接から言いますが、申し訳ありませんが、また面接に引っ張って見て、実は言わないでください.普段注意していないものは、面接の時にすぐにどこに問題があるのかをつかんでしまいます.
例えば、私はその时小さくつまずいて、つまずいて大丈夫で、重要なのは私が確かにjsのいくつかの問題に対して徹底的に理解していないことです.
ことわざにもあるように、半灌水の音がして、私はずっと自分のjsの基礎が良いと思っている人ですが、本当に手を出して言えば、実は本当に少し水があります......この时もっとよく勉強しないで、井戸に座って天を見ているのではないでしょうか.
弟の最近の文章は基本的に書きながら出していますが、もし皆さんが何か問題を見つけたり、くだらない話が多すぎると感じたら、許してください.
かんだんようりょういき
javascriptの役割ドメインを知っていますか?本当に分かりますか?では、この問題を試してみましょう.
1 if (!("a" in window)) {
2     var a = 1;
3 } 
4 alert(a);

はい、あなたの答えを出してください.私はもう邪悪な笑みを浮かべました.多くの人がこの問題を見て頭がぼんやりしているからです.私も少しぼんやりしていると言いますか.??一緒に彼女のセクシーなコートを剥がしましょう.
第一歩:「a」in windowこれはどういう意味ですか?
aはwindowの属性ですか?では、実験をしましょう.
私が行くと、あなたはvar aを注釈しても注釈しなくても、aはwindowの属性であることに気づきます......そこで上の答えは叫びます!!!しかし、私たちの頭の中で糊が膨らんで広がっています.
jsの変数役割ドメインには、すべての変数宣言が範囲役割ドメインの上部にあるという原則があります.
だから、前に私は愚かな間違いを犯して、間違いは私さえ驚いて、だから私は自分で飲んでみんなをからかって、罠に注意しました:
実はさっきの完全なコードはこうでした.
    <script type="text/javascript">
//        var a;
        var in_window = 'a' in window;
        alert(in_window);
        if (!("a" in window)) {
            var a = 1;
        } 
        alert(a);
    </script>

すると、in_Windowsはもちろんtrueで、これこそ隠れた真相です!!!
次のコードにコメントすると、次のようになります.
やっと正しいです.さっき自分の間違いで最近勉強したことを覆すところでした.恐ろしいですね.
「すべての変数が範囲の役割ドメインの上部に表示される」とはどういう意味かを見てみましょう.
一番下に定義された変数が自動的に上に上がるという意味です!!!変数を定義するときは、直接すべて定義したほうがいいです.
本題に戻ります.
if (!("a" in window)) {
    var a = 1;
} 
alert(a);

実は彼はこのようにするべきです...
var a;
if (!("a" in window)) {
    a = 1;
} 
alert(a);

彼はifの中の申明も早めにして、どのように不服でしょう、実は私も少し不服です.もう一度やってみたいです.
var s = '';
if (false) {
    var a = 1;
}

注意してください.sには何の意味もありません.私のためにブレークポイントを設定します.
これで真相が現れ、いずれにしてもaの申明には以下のいくつかの状況が含まれている.
var s = '';
while (false) {
    var a = 1;
}

変形1
勉強して考えなければ聞かないので、テーマを簡単に変形してみましょう.
if (!("a" in window)) {
    a = 1;
}
alert(a);

ifで申明を抜いたら、この問題は「1」ですが、ifのコードが実行されなければ間違いですよ.
変形2:関数にぶつかった
さっきのそれは今から見れば比較的簡単ですが、今私たちはこのようにしてどうなるかを見てみましょう(私は暇な卵が痛いことを認めました).
if (!("a" in window)) {
    var a = function () { window.a = 1; }
}
alert(a);

このように直すと本当に卵が痛くて、ここではaが定義されているのに関わらず、彼は関数の表現式で、関数の表現式はもとと同じで、だから変わらないで、ifの中で実行されません!
もしそうなら?
if (!("a" in window)) {
    function a() { window.a = 1; }
}
alert(a);

このシーンは実は私も馬鹿です.では、ブレークポイントを設定してみましょう.
aはwindowにないようですのでifのコードを実行します.
ここではもう一つの問題を引き出しました.いったい変数が繰り上げられたのか、関数が繰り上げられたのか.
var a = '1';
function a(){}
alert(a);
function a() { }
var a = '1';
alert(a);

この2つの書き方で最終出力が異なるのでしょうか??答えはできない、彼らの結果はすべて1で、原因は関数式の申明がもっと優先されたので、どのように関数式を書いても何が一番前にあります!!
function a() {return false; }
if (a()) {
    var a = '1';
}
s = '';
alert(a);
function a() {return  true; }
if (a()) {
    var a = '1';
}
s = '';
alert(a);

私たちは前に言ったように、いずれにしてもifの中の申明は早めになります.では、この2つの問題を書き直すことができます.
var a = function () { return true };
var a;
if (a()) {
    a = '1';
}
s = '';
alert(a);

注意:ここの10行は、変数aが明記されているにもかかわらず付与されていないので、aは関数であることがここからもわかります.
だから上の2つの答えは大丈夫です.1つの印刷関数、1つの印刷数字1です.
変形3
1 var a = 1,
2 b = function a(x) { x && b(--x); }; 
3 alert(a);

コードを実行しないで解析できるかどうか試してみますが、答えはできません..私は解析できません.やはり運行しましょう.私は水が多すぎます.ここでは、いくつかの重要な概念について説明します.
1                 
2          ,                       ,       
3            ,         ,        

問題を解決するには、私はいつも正直に仕事をしましょう.
ルール3によると、この結果は問題なく、次の
 
ここからvar aを注釈すればfunction a()はそれと何の関係もないので、直接無視することができます(間違いがあるかもしれません)
この問題は次のように理解できます.
var a = 1,
b = function (x) { x && b(--x); }; 
alert(a);

坑お父さんの私はもともとjsの中のthisに対して次の研究をしたいと思って、作用域の関连するものの上でこんなに长い间回転したとは思わなかったが、今回の振り回されを経て私はこの地方で私は问题がないと信じていますか??
本題に入る
通常、thisは前述のGlobal Object、すなわちBrowser環境時のwindow Objectを表す.
functionがオブジェクトのmethodとして使用される場合、thisはこのfunctionが属するobjectを表します.