5

void(document.body.innerText += 'hi')

eval(document.body.innerText +='\nbye')

Function(document.body.innerText += '\n!!!')

void(Function(function foo(){document.body.innerText += '\n>hi2'; return true}).toString())();

eval(Function(function foo(){document.body.innerText += '\nbye2'; return true}).toString())();

Function(Function(function foo(){document.body.innerText += '\n!!!2'; return true}).toString())();

これらの異なるステートメント内でコードを実行するための処理モデルは何ですか?

void(alert('hi'))
undefined

eval(alert('hi'))
undefined

Function(alert('hi'))
function anonymous() {
  undefined
}

eval(Function(function foo(){return true}).toString())();
TypeError: undefined is not a function

void(Function(function foo(){return true}).toString())();
TypeError: string is not a function

Function(Function(function foo(){return true}).toString())();
undefined
4

3 に答える 3

4

この記事では、evalおよびFunctionコンストラクターについて説明します。

(…) グローバルな組み込みeval関数は、 caller のスコープ内でコードを評価します

コンストラクターによって作成された関数内から実行されるコードFunctionは、実際にはグローバル スコープでは実行されません。ただし、ローカル スコープでも実行されないため、混乱を招く可能性があります。 Functionコンストラクターは、スコープチェーンがグローバルスコープのみで構成される関数を作成します(もちろん、関数自体のアクティベーションオブジェクトが先行します)。Functionコンストラクターによって作成された関数に含まれるすべてのコード は、グローバル スコープではなく、その関数のスコープで評価されます。ただし、グローバル オブジェクトはスコープ チェーンの次のオブジェクトであるため、コードがグローバルに実行されるのとほとんど同じです。

そして、このページによると、void単に戻りますundefined:

多くの言語でvoidは、値を持たない型です。JavaScript では void、オペランドを受け取って を返す演算子ですundefined。これは役に立たず、非常に混乱します。避けてくださいvoid

于 2012-04-27T01:37:39.070 に答える
3

評価の違いをまとめると次のようになります。

  • void含まれている関数スコープでコードを評価します
  • eval含まれている関数スコープで文字列を評価します
  • Function独自のスコープでコードを評価します

そしてリターンの違い:

  • void常に未定義を返す
  • eval実行されたコードの戻り値を返します
  • Function無名関数を返します

参考文献

于 2014-11-04T16:55:46.593 に答える