Javascript閉パッケージとpython閉パッケージ
1403 ワード
次のコードはjavscript関数の閉パッケージをよく示しています.javascriptにはブロック作用ドメインがなく、関数作用ドメインしかありません.
10を印刷します.すべてのf関数が同じ役割ドメインwindowを共有するため、呼び出し時に同じwindowのi、すなわちループ終了後のiを検索する
解決策は多く,そのうちの1つはiが関数の最下層の役割ドメインにコピーされることである.
ある人によると、perl pythonの最初の表示で0を出力でき、ブロックの役割ドメインがあるのでjavascriptのほうが合理的だと思いますが、perl pythonのやり方では、関数を定義するときに関数に使われる外部変数を全部自分でcopyするのではないでしょうか.
perl、python、本当ですか?
PS:後記:
pythonにはブロックの役割ドメインはありません.モジュール、クラス、関数の役割ドメインだけです.上記javascriptの等価pythonコード:
出力10はjavasciptと一致!
参照先:
JavaScriptオブジェクトモデル-実行モデル
python閉パッケージ
var f=[];
for(var i=0;i<10;i++)
f.push(function(){alert(i);});
f[0]();
10を印刷します.すべてのf関数が同じ役割ドメインwindowを共有するため、呼び出し時に同じwindowのi、すなわちループ終了後のiを検索する
解決策は多く,そのうちの1つはiが関数の最下層の役割ドメインにコピーされることである.
var f=[];
for(var i=0;i<10;i++)
f.push(function(i){return function(){alert(i);}}(i));
// , copy i
//f.push(function(){var t=i;return function(){alert(t);}}());
f[0]();
ある人によると、perl pythonの最初の表示で0を出力でき、ブロックの役割ドメインがあるのでjavascriptのほうが合理的だと思いますが、perl pythonのやり方では、関数を定義するときに関数に使われる外部変数を全部自分でcopyするのではないでしょうか.
perl、python、本当ですか?
PS:後記:
pythonにはブロックの役割ドメインはありません.モジュール、クラス、関数の役割ドメインだけです.上記javascriptの等価pythonコード:
fs=[]
i=0
while i<10:
def t():
print i,"!"
fs.append(t)
i=i+1
fs[0]()
#
print t
print fs[0]
print fs[9]
出力10はjavasciptと一致!
参照先:
JavaScriptオブジェクトモデル-実行モデル
python閉パッケージ