ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript_javascript スキルの eval 関数の問題

JavaScript_javascript スキルの eval 関数の問題

WBOY
WBOYオリジナル
2016-05-16 15:16:481269ブラウズ

今日コードを見てみると、eval 関数で問題が発生しました。たくさんのブログ記事を読んだのですが、まだ eval 関数がよく理解できていません。次のように理解してください:

/*
var start = []
 , end = []
 , timings = [];
*/
function f(){
 //模拟程序执行时间
 var sum = 0;
 for(var i =0 ;i < 100000; i++){
  sum = sum/(i+1);
 }
}
function repeat(n, action){
 for(var i=0; i<n ;i++){
  eval(action); // eval函数
 }
}
function benchmark(){
 var start = []
  , end = []
  , timings = [];
 repeat(100, "start.push(new Date().getTime());f();end.push(new Date().getTime())");
 for (var i =0; i< start.length; i++){
  timings[i] = end[i] - start[i];
 }
 return timings;
}
benchmark(); //结果为:[]
//如果我把上面的benchmark中的局部变量移到全局就一切正常.

上記のベンチマークのローカル変数をグローバル変数に移動すると、すべて正常に動作します。

ここでの eval 関数がこのような効果を生み出すのはなぜですか?これは eval 関数のエイリアス化と同等ですか?

eval() が直接呼び出される場合、それは常に呼び出しのコンテキスト スコープ内で実行されます。つまり、repeat 関数の変数にはアクセスできますが、ベンチマーク関数の変数にはアクセスできません。関数内でアクセスできるため、開始変数をグローバル変数に設定すると、必要な結果を返すことができます。

function repeat(n, action){
 for(var i=0; i<n ;i++){
  start.push(new Date().getTime());f();end.push(new Date().getTime()); // eval函数
 }
}

繰り返しでは開始変数と終了変数にアクセスできません

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。