<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>
質問:
表示されます: ReferenceError: add_them が定義されていません。何が問題なのですか? 正しい結果を表示する方法: 13?
<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>
質問:
表示されます: ReferenceError: add_them が定義されていません。何が問題なのですか? 正しい結果を表示する方法: 13?
あなたはブラウザを混乱させています(まあ、仕様によれば技術的には正しいです)。
関数を式として扱う別のトリックを試してください。
(function add_them(a,b) { return a+b;})(9,4) // 13
または単に:
console.log((function add_them(a,b) { return a+b;})(9,4)) // logs 13
パラメータを固定しようとしているだけの場合は.bind
、関数を値に変換できます(これは、あなたがやろうとしているように思えます):
var add_them = (function(a,b) { return a+b;}).bind(null, 9,4)
console.log(add_them());// logs 13
単純な関数宣言が必要なようです:
function add_them(a,b) { return a+b;}
console.log(add_them(9,4));
すぐに呼び出される関数式を使用する場合は、次のようになります。
console.log(function add_them(a,b) { return a+b; } (9,4));
// \ expression / ^^^^^
// invocation
ただし、識別子 ( add_them
) は、関数式の外 (後) で再利用できません。
また、IEFE が何らかの結果を生成することになっている場合、(function () {})() よりも !function(){}() の方が (少し) 有利であることに注意してください。結果が否定されるため、無視されます。
問題は、すぐに呼び出される関数式が関数式であることです。
JavaScript では、関数は宣言または式のいずれかです。たとえば、次のことを考慮してください。
(function (a, b) { return a + b; }) // This is an expression
function (a, b) { return a + b; } // This is a declaration
関数式と関数宣言を区別する方法は? 式が必要な場所で関数を使用すると、自動的に式になります。関数式はすぐに呼び出すことができます。
一方、JavaScript の宣言は巻き上げられるため、関数宣言も簡単に見つけられます。したがって、関数は、プログラムに現れる前に呼び出すことができます。たとえば、次のことを考慮してください。
console.log(add(2, 3));
function add(a, b) {
return a + b;
}
コードの問題は、すぐに関数式を呼び出していることです。ただし、これは宣言ではなく式であるため、通常の関数のように使用することはできません。関数を使用するには、関数を宣言する必要があります。
代わりにこれを行います:
add_them(9, 4);
console.log(add_them());
function add_them(a, b) {
return a + b;
}
関数のパラメータを修正したい場合はbind
、次のように使用できます。
var add_9_4 = add_them.bind(null, 9, 4);
console.log(add_9_4());
function add_them(a, b) {
return a + b;
}
それが役立つことを願っています。