18

第一級関数は、それらが変数として動作することを意味しませんか?明らかに、これらは変数とまったく同じようには動作しません。

console.log(foo);
var foo = 'bar';

...動作しませんが、これは:

console.log(foo());
function foo() {
 return('bar');
}

...します。

そうは言っても、これは:

console.log(foo());
var foo = function() { return 'bar'; };

動作しません。これはより一貫性があります。

何が得られますか?

4

4 に答える 4

18

あなたが経験していることは巻き上げと呼ばれます。次のような関数宣言を使用する場合:

function foo() {}

foo最も近いスコープ(関数)の一番上に移動します。

一方、次のような関数式または関数割り当てを使用する場合:

var foo = function() {}

変数fooは一番上に移動しますが、必要なときに割り当てが行われます。

もっと詳しく知る

于 2012-09-05T03:18:26.850 に答える
10

同じことを比較しないからです。あなたの例では、関数宣言 function foo()...変数宣言および代入と比較しますvar foo = 'bar';

より正確な比較は次のようになります。

console.log(foo);
var foo = 'bar';

console.log(foo());
var foo = function() {
 return 'bar';
}

機能宣言は、巻き上げの仕組みによって解釈が異なります。巻き上げると、すべての宣言が最も近いスコープの一番上に移動し、割り当てはそのままになります。

関数宣言は、その意味で特別です。これは、1つのステートメントでの宣言と式/割り当ての両方であり、したがって一緒に持ち上げられるためです。

例として:次のような式を見ることができます:

console.log(foo);
var foo = 'bar';

このように:

var foo;
console.log(foo); //prints undefined
foo = 'bar';

console.log(foo());
var foo = function() {
 return 'bar';
}

このように:

var foo;
console.log(foo());
foo = function() {
 return 'bar';
}
于 2012-09-05T03:24:05.673 に答える
6

関数宣言は、JSのスコープの最上位に自動的にバンプされます

console.log(foo());
function foo() {
 return('bar');
}

実際には次のように解釈されます

function foo() {
 return('bar');
}
console.log(foo());

fooは変数であり、関数ではないため、コードの2番目のビットはそのように機能しています(値として無名関数を持っているだけです)。変数も上にぶつかるので、

console.log(foo());
var foo = function() { return 'bar'; };

になります

var foo; //empty variable
console.log(foo()); //undefined
foo = function() { return 'bar'; }; //creates a function without name and assigns it to foo
于 2012-09-05T03:18:19.860 に答える
4

関数宣言と変数宣言は常にスコープの一番上に移動されます。

console.log(foo());
function foo() {
   return 'bar';
}

次のように解釈されます:

function foo() {
   return 'bar';
}
console.log(foo());

console.log(foo());
var foo = function () {
   return 'bar';
};

次のように解釈されます:

var foo;
console.log(foo());
foo = function () {
   return 'bar';
};
于 2012-09-05T03:24:09.197 に答える