4

私が間違っている場合はコメントを残してください:私の記憶の中で、私は関数作成の2つのスタイルの違いを考えました:

function myFunc(){};

myFunc = function(){};

はすぐに最初の評価であり、後で関数呼び出しを待ちます。

したがって、この記事でグローバル変数がウィンドウオブジェクトにアタッチされることについてこのコードを取得しました。

function setGloabalVariable(){
  window.variable = '1';
}

ページを読み込んだ後、なぜ変数がまだ定義されていないのですか?

4

3 に答える 3

3

これら 2 種類の宣言の違いは、1 つ目は名前付き関数ステートメントであり、2 つ目は無名関数であることです。 どちらも宣言の時点で自動的に実行されません (IIFE を考えているかもしれません)。

// Create a symbol named "my_named_function"
// that points at the named function "my_named_function"
function my_named_function() {
}

// Create a symbol named "my_anonymous_func"
// that points to the *unnamed* function <anonymous function>
var my_anonymous_func = function() {
}

my_named_functionとの両方my_anonymous_funcが未実行です。両方を呼び出すことで実行できます。

my_named_function();
my_anonymous_func();

IIFE (即時実行関数式) の動作は少し異なります。

(/* define a function */ function() {

})(/* and *immediately* execute it */);

このテーマの詳細については、関数式とステートメントに関する kangax の優れた記事を読むことをお勧めします。

于 2012-08-21T05:54:00.043 に答える
0

名前付き関数はコンパイル時に作成および割り当てられるため、コードの実行が開始される前に存在します。例:

x(); // This works, as the function below already exists

function x() {}

匿名関数はコンパイル時に作成できますが(実装によって異なります)、値は実行時に変数に割り当てられます。例:

x(); // This doesn't work, as the value is not assigned yet

x = function(){};

x(); // Here it works

どちらの場合も、実行する関数内のコードに対して実際に関数を呼び出す必要があります。

于 2012-08-21T06:54:53.027 に答える
0

function myFunc(){}はグローバル関数リテラルであり、すぐに「実行」されるわけではありませんが、前方および後方参照できます。意味:

myFunc(); // this will run
function myFunc(){}

次のように:

myFunc(); // this will **not** run
myFunc = function (){}

2 番目の関数との違いは、a を宣言していないにもかかわらずですvar myFunc =。これはグローバル変数 (インライン無名関数とも呼ばれます) になります。グローバル インライン関数とは異なり、使用するためには何かの上にある (後方参照される) 必要があります。

function setGloabalVariable(){
    window.variable = '1'; 
    // this could have been written
    // variable = '1'; var variable = '1';
    // unless this function is called in some global scope, the closure won't
    // bring out this variable
}

匿名関数は即座に実行されます。それがあなたが考えていることだと思います(ただし、OPにはありませんでした)。

(function () { }());

自己実行匿名関数に関する記事

無名関数は、ローカル/内部スコープを作成しました。名前空間を作成し、グローバル名前空間から遠ざけるのに最適です。

于 2012-08-21T05:55:33.483 に答える