私はJavaScriptの初心者です。私は入れ子関数を回避する方法を見つけようとしていました。さて値y
を維持し、その機能apple()
とsetTimeout
フォームの閉鎖以来、コンソールに印刷し、それがうまく機能している以下の2例閉鎖なしで非同期呼び出しで変数を使用できるようにする
// example 1
var x = 45;
function apple(){
var y = 60;
setTimeout(function(){
console.log(y);
console.log(x);
}, 20);
}
apple();
console.log(x);
を見てみましょう。今、私はrun()
を機能させる機能利用可能apple()
の変数を作るのですかどのように私は別に関数本体を配置したかった
var x = 45;
var run = function(){
console.log(y);
console.log(x);
};
function apple(){
var y = 60;
setTimeout(run, 20);
}
apple();
console.log(x);
コードの下を見て、引数として関数ハンドラを渡すが、私は立ち往生午前事があります彼らはもはや閉鎖を形成しないからです。それを可能にする回避策はありますか?親切に私を助けてください。
一般的な方法で私に答えると、nodejs APIにも適用されます。私はsetTimeout
がより多くの議論を受け入れるのを見てきましたが、関数プロトタイプとは無関係に解決策を適用したいと思っています。
更新
申し訳ありませんが、私はすべての答えは、値渡しを使用して関数呼び出しを行うと思います。その閉鎖を達成していない。彼らは、現在のy
値をとり、関数の引数として渡し、これはY = 60としない80 run()
内部を印刷
var y = 60;
setTimeout(run, 20);
y = 80;
コードの下等setTimeout()
後y = 80
の文が存在すると仮定する。私は実際にyの参照を維持し、クロージャのようにその値をキャプチャしないことを望みます。あなたは
申し訳ありませんが、私は上記のコードが参考になると思います。それは実際に価値によって捕捉されます。たとえば、setTimeout文の後にy = 80があるとします。 setTimeoutハンドラは、80ではなく60を出力します。 – user3205479
この解決策はクロージャのようには機能しません。更新された質問をご覧くださいありがとうございました – user3205479
@ user3205479プリミティブ値は常に値によって渡されます。あなたが求めていることは不可能です。 – Schlaus