2
<script>
!function add_them(a,b) { return a+b;} (9,4)
console.log(add_them());
</script>

質問:

表示されます: ReferenceError: add_them が定義されていません。何が問題なのですか? 正しい結果を表示する方法: 13?

4

3 に答える 3

1

あなたはブラウザを混乱させています(まあ、仕様によれば技術的には正しいです)。

関数を式として扱う別のトリックを試してください。

(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
于 2013-06-21T02:02:40.297 に答える
1

単純な関数宣言が必要なようです:

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(){}() の方が (少し) 有利であることに注意してください。結果が否定されるため、無視されます。

于 2013-06-21T02:04:28.073 に答える
1

問題は、すぐに呼び出される関数式が関数式であることです。

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;
}

それが役立つことを願っています。

于 2013-06-21T02:12:50.780 に答える