静的スコープと動的スコープの間に類似点はありますか? ほとんど見つかりません。
2 に答える
there isn't a similarity between both as far as i know. there's only difference between them like @Jules explained above In static scoping, a name refers to its closest binding, going from inner to outer scope in the program text In dynamic scoping, a name refers to its closest binding at runtime.
静的スコープまたは字句スコープとは、変数が宣言されている場所を、周囲のスコープを調べることで決定できることを意味します。動的スコープとは、変数が宣言されている場所が、コール スタックを検索することによって動的に決定されることを意味します。例えば:
var x = 2;
function foo(){
return x;
}
function bar(...){
var x = 3;
print(foo());
}
bar();
静的スコープまたはレキシカル スコープでは、これは 2 を出力します。foo 内の x は、周囲のスコープから取得されます。動的スコープでは、これは 3 を出力します。これは、x の値がコール スタック内で bar 関数呼び出しを検索することによって決定されるためです。その時点で x が定義されているため、値 x=3 が使用されます。
初期の Lisp は、すべての変数に対して動的スコープを使用していましたが、それは間違いであると広く見なされてきました。後の Lisp やその他のほとんどの言語では、レキシカル スコープが使用されます。Common Lisp のような一部の言語は、特別な動的スコープ変数を提供します。C# や Java などの主流言語にも、限定された形式の動的スコープがあります。通常、例外ハンドラーは動的にスコープされます。例外を発生させた場合、呼び出された例外ハンドラーは、コードの構造によって静的に決定されるのではなく、スタック上で動的に検索されます。例えば:
try {
function foo(){
throw new Exception();
}
} catch (Exception e){ print "A"; }
try {
foo();
} catch (Exception e){ print "B"; }
このコードは、「A」ではなく「B」を出力します。このコードを C# などで記述するには、ラムダ式を使用する必要があることに注意してください。