次のコード:
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
console.log(a(4));
console.log(a(5));
a()を呼び出すたびに関数alfa()が作成されますか?
次のコード:
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
console.log(a(4));
console.log(a(5));
a()を呼び出すたびに関数alfa()が作成されますか?
はい、そうなります。
関数宣言とによって宣言された変数var
は両方とも、関数の呼び出し時に引き上げられます。つまり、関数コンテキストのどこで関数宣言が宣言されているかに関係なく、技術的には常に事前に宣言されます。
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
技術的になります
a = function(b) {
function alfa() {
return 7;
}
return alfa() + b;
}
a()を呼び出すたびに関数alfa()が作成されますか?
新しい関数オブジェクトは毎回作成され、はい、異なる実行コンテキストにバインドされます(したがって、作成時b
に渡された値にアクセスできます。これは、呼び出し先のコンテキストに対する「クロージャー」です。作成されました)。a
alfa
a
スマートJavaScriptエンジン(V8など)は、基盤となるコードを再利用できますが、毎回異なるオブジェクトが作成されます。
はい、そうなります。を呼び出すたびa
に、の新しいインスタンスalfa
が作成されます。
ちなみに、この場合、コンテキストをalfa
閉じa
ます。これは私たちがクロージャと呼んでいるものであり、異なる呼び出しの間の関数で状態を保持することを可能にします。
はい。
使用する構文は、このための砂糖です:
a = function(b) {
var alfa = function() {
return 7;
}
return alfa() + b;
}
console.log(a(4));
console.log(a(5));
alfa
を実行するたびに、作成および割り当てが明確になりますa
。
この簡単な変更でテストすることもできます:
a = function(b) {
return alfa; // let's return the function
function alfa() {
return 7;
}
}
console.log(a(4)==a(4)); // logs false
alfa
毎回作成されることを避けたい場合は、これを行うことができます:
a = (function(){
var alfa = function() {
return 7;
}
return function(b) {
return alfa() + b;
}
})();