2

次の条件ステートメントは、値が定義されていない場合に例外をスローします。

if (!(e = e[f])) {
    e[f] = {};
}  

ただし、次のインライン条件は例外をスローしません。

e = e[f] ? e[f] : e[f] = {};

条件を含む関数は次のとおりです。ウィンドウオブジェクトから動的にオブジェクトを作成します。

function t(a, c) {
    var s = a.split('.'),
        e = window;
    // works only in IE
    !(s[0] in e) && e.execScript && e.execScript('var '+ s[0]);
    for (var f; s.length && (f = s.shift()); ) {
        if (!s.length && void 0 !== c) {
            e[f] = c;
        }else {
            e = e[f] ? e[f] : e[f] = {};
        }
    }
}

この関数を呼び出す例:

t('s.d');

この呼び出しにより、新しいオブジェクトが作成されます。window.s.d

誰かが何が起こっているのかについて何か考えがありますか?

4

2 に答える 2

2

最初のケース:

if (!(e = e[f])) {
    e[f] = {};
}

(オブジェクトeに設定された)プロパティ(つまり)に設定しています。このプロパティは未定義であり、これに「注意」するとtrueが返され、ステートメントが効果的に渡されます。次の行はまだ定義されていません、そしてあなたがそうするときwindow.st('s.d')!e

e[ f ] = {};

これは次のように解釈されます。

undefined[ f ] = {};

これがエラーの原因です。

2番目の(3次)ケース:

e = e[f] ? e[f] : e[f] = {};

これは次のように解析されます。

e = (e[f]) ? e[f] : e[f] = {};

としてではなく

(e = e[f]) ? e[f] : e[f] = {};

後者の場合に解析された場合、最初のオペランド(e[f])が未定義を返し、三項演算子(e[f] = {})の誤った場合になるため、条件付きの場合と同じエラーが発生します。これはundefined[f] = {}、エラーの原因にもなります。

于 2012-12-09T17:10:04.473 に答える
1

それを分解する:

  1. e = e[f]、それは割り当てです。

    e存在しないundefined場合は割り当てられます。e[f]

  2. !(e = e[f])ですtrue

    このステートメントは、というプロパティが含まれていないtrueためです。ef

  3. if (!(e = e[f])) { ... }、次に条件が満たされます。

  4. if( ... ){ e[f] = {}; }

    この時点eで値が保持されますundefined。これはに変換されるundefined[f] = {}ため、エラーになります。

于 2012-12-09T17:12:09.013 に答える