JavaScriptクロージャと無名関数

570
leemes 2012-10-17 22:36.

私の友人と私は現在、JSの閉鎖とは何か、そうでないものについて話し合っています。私たちはそれを本当に正しく理解していることを確認したいだけです。

この例を見てみましょう。カウントループがあり、コンソールにカウンター変数を遅延して出力したいと思います。したがってsetTimeoutクロージャを使用してカウンタ変数の値をキャプチャし、値NのN倍を出力しないようにします。

クロージャまたはクロージャに近いものがない場合の間違った解決策は次のとおりです。

for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}

もちろんi、ループ後の値の10倍、つまり10を出力します。

それで彼の試みは:

for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i;
        setTimeout(function(){
            console.log(i2);
        }, 1000)
    })();
}

期待どおりに0から9を出力します。

私は彼がキャプチャするためにクロージャを使用していないと彼に言いましたi、しかし彼は彼がそうだと主張します。私は、forループ本体を別の本体に入れて(彼の無名関数をに渡して)、クロージャを使用しないことを証明し、10回10回再度出力しました。彼の関数をに格納し、ループの後に実行し 10回10回出力する場合も同じです。したがって、私の主張は、彼は実際にはの値をキャプチャせず、バージョンをクロージャではないということです。setTimeoutsetTimeoutvari

私の試みは:

for(var i = 0; i < 10; i++) {
    setTimeout((function(i2){
        return function() {
            console.log(i2);
        }
    })(i), 1000);
}

したがって、(クロージャー内でi名前が付けられたi2)キャプチャーしますが、別の関数を返し、これを渡します。私の場合、setTimeoutに渡された関数は実際にをキャプチャしiます。

今、誰がクロージャを使用していて、誰が使用していないのですか?

どちらのソリューションもコンソールで0から9を遅延して出力するため、元の問題は解決されますが、これら2つのソリューションのどちらがクロージャー使用してこれを実現するかを理解したいと思います。

11 answers

660
Aadit M Shah 2012-10-18 00:01.

編集者注:この投稿で説明されているように、JavaScriptのすべての関数はクロージャです。ただし、理論的な観点から興味深いこれらの関数のサブセットを特定することにのみ関心があります。以降、クロージャという単語への言及は、特に明記されていない限り、この関数のサブセットを指します。

クロージャーの簡単な説明:

  1. 関数を取ります。それをFと呼びましょう。
  2. Fのすべての変数をリストします。
  3. 変数には次の2つのタイプがあります。
    1. ローカル変数(バインドされた変数)
    2. 非局所変数(自由変数)
  4. Fに自由変数がない場合、クロージャにすることはできません。
  5. Fに自由変数(Fの親スコープで定義されている)がある場合、次のようになります。
    1. 自由変数がバインドされるFの親スコープは1つだけでなければなりません。
    2. Fがその親スコープの外部から参照されている場合、Fはその自由変数のクロージャになります。
    3. その自由変数は、クロージャーFのアップバリューと呼ばれます。

次に、これを使用して、誰がクロージャを使用し、誰がクロージャを使用しないかを把握しましょう(説明のために、関数に名前を付けました)。

ケース1:あなたの友達のプログラム

for (var i = 0; i < 10; i++) {
    (function f() {
        var i2 = i;
        setTimeout(function g() {
            console.log(i2);
        }, 1000);
    })();
}

上記のプログラムには、との2つの関数がfありgます。それらがクロージャであるかどうかを見てみましょう:

の場合f

  1. 変数をリストします。
    1. i2あるローカル変数。
    2. i自由変数です。
    3. setTimeout自由変数です。
    4. gあるローカル変数。
    5. console自由変数です。
  2. 各自由変数がバインドされている親スコープを見つけます。
    1. iされるバインドグローバルスコープに。
    2. setTimeoutされるバインドグローバルスコープに。
    3. consoleされるバインドグローバルスコープに。
  3. 関数はどのスコープで参照されますか?グローバルスコープ
    1. したがってによって閉じられることiはありません。f
    2. したがってによって閉じられることsetTimeoutはありません。f
    3. したがってによって閉じられることconsoleはありません。f

したがって、関数fはクロージャではありません。

の場合g

  1. 変数をリストします。
    1. console自由変数です。
    2. i2自由変数です。
  2. 各自由変数がバインドされている親スコープを見つけます。
    1. consoleされるバインドグローバルスコープに。
    2. i2されるバインドのスコープにf
  3. 関数はどのスコープで参照されますか?の範囲setTimeout
    1. したがってによって閉じられることconsoleはありません。g
    2. したがってi2にわたって閉鎖することによってg

従って関数は、g自由変数の閉鎖であるi2(のための上位値であるg)、それはい参照内から。setTimeout

あなたにとって悪いこと:あなたの友人はクロージャを使用しています。内部機能はクロージャです。

ケース2:あなたのプログラム

for (var i = 0; i < 10; i++) {
    setTimeout((function f(i2) {
        return function g() {
            console.log(i2);
        };
    })(i), 1000);
}

上記のプログラムには、との2つの関数がfありgます。それらがクロージャであるかどうかを見てみましょう:

の場合f

  1. 変数をリストします。
    1. i2あるローカル変数。
    2. gあるローカル変数。
    3. console自由変数です。
  2. 各自由変数がバインドされている親スコープを見つけます。
    1. consoleされるバインドグローバルスコープに。
  3. 関数はどのスコープで参照されますか?グローバルスコープ
    1. したがってによって閉じられることconsoleはありません。f

したがって、関数fはクロージャではありません。

の場合g

  1. 変数をリストします。
    1. console自由変数です。
    2. i2自由変数です。
  2. 各自由変数がバインドされている親スコープを見つけます。
    1. consoleされるバインドグローバルスコープに。
    2. i2されるバインドのスコープにf
  3. 関数はどのスコープで参照されますか?の範囲setTimeout
    1. したがってによって閉じられることconsoleはありません。g
    2. したがってi2にわたって閉鎖することによってg

従って関数は、g自由変数の閉鎖であるi2(のための上位値であるg)、それはい参照内から。setTimeout

あなたに良い:あなたはクロージャを使用しています。内部機能はクロージャです。

したがって、あなたとあなたの友人の両方がクロージャーを使用しています。議論をやめなさい。クロージャの概念と、両方のクロージャを識別する方法をクリアしたことを願っています。

編集:なぜすべての関数がクロージャであるかについての簡単な説明(クレジット@Peter):

まず、次のプログラムについて考えてみましょう(これはコントロールです)。

lexicalScope();

function lexicalScope() {
    var message = "This is the control. You should be able to see this message being alerted.";

    regularFunction();

    function regularFunction() {
        alert(eval("message"));
    }
}

  1. 両方とも上記の定義からのクロージャlexicalScoperegularFunctionはないことを私たちは知っています
  2. プログラムを実行すると、クロージャではないため(つまり、親スコープ内のすべての変数にアクセスできるため)、アラートが表示 messageされること regularFunction期待されます。message
  3. 私たちは、プログラムを実行すると、我々は観察することがmessage実際に警告されます。

次に、次のプログラムについて考えてみましょう(これは代替プログラムです)。

var closureFunction = lexicalScope();

closureFunction();

function lexicalScope() {
    var message = "This is the alternative. If you see this message being alerted then in means that every function in JavaScript is a closure.";

    return function closureFunction() {
        alert(eval("message"));
    };
}

  1. 上記の定義からのclosureFunctionクロージャだけであることがわかっています
  2. 私たちは、プログラムを実行すると、私たちは期待して message警告することがないので closureFunction(つまり、それだけでそのすべてにアクセスできている閉鎖された非ローカル変数関数が作成されたときこの答えを参照-これは含まれていませんが)message)。
  3. プログラムを実行すると、実際にアラートが送信されていることがわかりmessageます。

これから何を推測しますか?

  1. JavaScriptインタープリターは、クロージャを他の関数と同じように扱います。
  2. すべての関数は、スコープチェーンを一緒に運びます。クロージャーには、個別の参照環境はありません。
  3. クロージャは他のすべての関数と同じです。これは興味深いケースであるため、それらが属するスコープのスコープで参照されている場合は、単にクロージャと呼びます。
97
kev 2012-10-17 22:59.

closure定義によると:

「クロージャ」は、自由変数とそれらの変数をバインドする(式を「閉じる」)環境を持つことができる式(通常は関数)です。

あなたは、使用しているclosureあなたは、関数の外で定義された変数を使用する関数を定義する場合。(変数を自由変数と呼びます)。
それらはすべて使用しますclosure(最初の例でも)。

55
brillout.com 2012-10-17 23:33.

一言で言えばJavascriptのクロージャする機能できるように変数にアクセスされる字句-親関数内で宣言を

より詳細な説明を見てみましょう。クロージャを理解するには、JavaScriptが変数をスコープする方法を理解することが重要です。

スコープ

JavaScriptでは、スコープは関数で定義されます。すべての関数は新しいスコープを定義します。

次の例を考えてみましょう。

function f()
{//begin of scope f
  var foo='hello'; //foo is declared in scope f
  for(var i=0;i<2;i++){//i is declared in scope f
     //the for loop is not a function, therefore we are still in scope f
     var bar = 'Am I accessible?';//bar is declared in scope f
     console.log(foo);
  }
  console.log(i);
  console.log(bar);
}//end of scope f

fプリントの呼び出し

hello
hello
2
Am I Accessible?

ここgで、別の関数内に関数が定義されている場合を考えてみましょうf

function f()
{//begin of scope f
  function g()
  {//being of scope g
    /*...*/
  }//end of scope g
  /*...*/
}//end of scope f

私たちは、呼び出します字句親のを。前に説明したように、現在2つのスコープがあります。スコープとスコープ。fgfg

しかし、一方のスコープはもう一方のスコープの「内部」にあるので、子関数のスコープは親関数のスコープの一部ですか?親関数のスコープで宣言された変数はどうなりますか。子関数のスコープからそれらにアクセスできますか?それはまさに閉鎖が介入するところです。

閉鎖

JavaScriptでは、関数gはスコープで宣言された変数にアクセスできるだけでなくg、親関数のスコープで宣言された変数にもアクセスできますf

以下を検討してください。

function f()//lexical parent function
{//begin of scope f
  var foo='hello'; //foo declared in scope f
  function g()
  {//being of scope g
    var bar='bla'; //bar declared in scope g
    console.log(foo);
  }//end of scope g
  g();
  console.log(bar);
}//end of scope f

fプリントの呼び出し

hello
undefined

行を見てみましょうconsole.log(foo);。この時点でスコープ内にgありfoo、スコープ内で宣言されている変数にアクセスしようとしますf。しかし、前に述べたように、ここでの場合のように、字句親関数で宣言された変数にアクセスできます。gの字句親ですf。したがってhello、印刷されます。
行を見てみましょうconsole.log(bar);。この時点でスコープ内にfありbar、スコープ内で宣言されている変数にアクセスしようとしますgbarは現在のスコープで宣言されておらず、関数gはの親ではないfためbar、未定義です

実際には、字句の「祖父母」関数のスコープで宣言された変数にアクセスすることもできます。したがって、関数h内に関数が定義されている場合g

function f()
{//begin of scope f
  function g()
  {//being of scope g
    function h()
    {//being of scope h
      /*...*/
    }//end of scope h
    /*...*/
  }//end of scope g
  /*...*/
}//end of scope f

その後、hすべての変数にアクセスできるようになる機能の範囲内で宣言hgf。これはクロージャで行われます。JavaScriptクロージャでは、レキシカル親関数、レキシカルグランド親関数、レキシカルグランドグランド親関数などで宣言された変数にアクセスできます。これはスコープチェーン見なすことができます。 scope of current function -> scope of lexical parent function -> scope of lexical grand parent function -> ... 字句の親を持たない最後の親関数まで。

ウィンドウオブジェクト

実際、チェーンは最後の親関数で停止しません。もう1つの特別なスコープがあります。グローバルスコープ。関数で宣言されていないすべての変数は、グローバルスコープで宣言されていると見なされます。グローバルスコープには2つの専門分野があります。

  • グローバルスコープで宣言されたすべての変数は、どこからでもアクセスできます
  • グローバルスコープで宣言された変数は、windowオブジェクトのプロパティに対応します。

したがってfoo、グローバルスコープで変数を宣言する方法は2つあります。関数で宣言しないかfoo、ウィンドウオブジェクトのプロパティを設定します。

どちらの試みもクロージャーを使用します

より詳細な説明を読んだので、両方のソリューションがクロージャーを使用していることが明らかになるかもしれません。しかし、確かに、証拠を作りましょう。

新しいプログラミング言語を作成しましょう。JavaScript-ノークロージャー。名前が示すように、JavaScript-No-Closureは、Closuresをサポートしないことを除いてJavaScriptと同じです。

言い換えると;

var foo = 'hello';
function f(){console.log(foo)};
f();
//JavaScript-No-Closure prints undefined
//JavaSript prints hello

さて、JavaScript-No-Closureを使用した最初のソリューションで何が起こるか見てみましょう。

for(var i = 0; i < 10; i++) {
  (function(){
    var i2 = i;
    setTimeout(function(){
        console.log(i2); //i2 is undefined in JavaScript-No-Closure 
    }, 1000)
  })();
}

したがって、これはundefinedJavaScript-No-Closureで10回印刷されます。

したがって、最初のソリューションはクロージャを使用します。

2番目の解決策を見てみましょう。

for(var i = 0; i < 10; i++) {
  setTimeout((function(i2){
    return function() {
        console.log(i2); //i2 is undefined in JavaScript-No-Closure
    }
  })(i), 1000);
}

したがって、これはundefinedJavaScript-No-Closureで10回印刷されます。

どちらのソリューションもクロージャーを使用しています。

編集:これらの3つのコードスニペットはグローバルスコープで定義されていないことを前提としています。それ以外の場合は、変数fooとするiと結合することになるwindowオブジェクトので、介してアクセス可能なwindowJavaScriptとJavaScriptの-NO-クロージャーの両方でオブジェクト。

22
Erik Reppen 2012-10-18 15:51.

私は誰もがこれを説明する方法に満足したことはありません。

クロージャを理解するための鍵は、クロージャなしでJSがどのようになるかを理解することです。

クロージャがないと、これはエラーをスローします

function outerFunc(){
    var outerVar = 'an outerFunc var';
    return function(){
        alert(outerVar);
    }
}

outerFunc()(); //returns inner function and fires it

クロージャが無効になっている架空のバージョンのJavaScriptでouterFuncが返されると、outerVarへの参照はガベージコレクションされ、内部関数が参照するために何も残されません。

クロージャは本質的に、内部関数が外部関数の変数を参照するときにそれらの変数が存在することを可能にする特別なルールです。クロージャを使用すると、参照される変数は、外部関数が実行された後、またはポイントを思い出すのに役立つ場合は「閉じられた」後でも維持されます。

クロージャがある場合でも、ローカルを参照する内部関数がない関数のローカル変数のライフサイクルは、クロージャのないバージョンの場合と同じように機能します。機能が終了すると、地元の人々はゴミを収集します。

内側の関数に外側の変数への参照があると、それはドアジャムがそれらの参照された変数のガベージコレクションの邪魔になるようなものです。

クロージャを調べるためのおそらくより正確な方法は、内部関数が基本的に内部スコープをそれ自体のスコープの基礎として使用することです。

しかし、参照されるコンテキストは実際には永続的であり、スナップショットのようではありません。返された内部関数を繰り返し起動して、外部関数のローカル変数をインクリメントおよびログに記録し続けると、より高い値を警告し続けます。

function outerFunc(){
    var incrementMe = 0;
    return function(){ incrementMe++; console.log(incrementMe); }
}
var inc = outerFunc();
inc(); //logs 1
inc(); //logs 2
17
Jon 2012-10-17 23:08.

どちらもクロージャーを使用しています。

私はここでウィキペディアの定義を使用します:

コンピュータサイエンスでは、クロージャ(字句クロージャまたは関数クロージャ)は、参照環境(その関数の非ローカル変数(自由変数とも呼ばれる)のそれぞれへの参照を格納するテーブル)とともに関数または関数への参照です。 。クロージャは、プレーンな関数ポインタとは異なり、関数がその直接の字句スコープの外で呼び出された場合でも、これらの非ローカル変数にアクセスできるようにします。

友人の試みiでは、値を取得してコピーを作成してローカルに格納することにより、ローカルではない変数を明確に使用していますi2

あなた自身の試みはi(呼び出しサイトでスコープ内にあります)無名関数に引数として渡されます。これは今のところクロージャではありませんが、その関数は同じを参照する別の関数を返しますi2。内部の無名関数の内部はi2ローカルではないため、これによりクロージャが作成されます。

13
Andrew D. 2012-10-17 23:03.

あなたとあなたの友人は両方ともクロージャを使用します:

クロージャは、関数とその関数が作成された環境の2つを組み合わせた特別な種類のオブジェクトです。環境は、クロージャーが作成されたときにスコープ内にあったローカル変数で構成されます。

MDN:https//developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

function(){ console.log(i2); }匿名関数のクロージャ内で定義された友人のコード関数で、function(){ var i2 = i; ... ローカル変数の読み取り/書き込みが可能ですi2

関数のfunction(){ console.log(i2); }クロージャ内で定義されたコード関数で、function(i2){ return ...ローカルの値を読み書きできますi2(この場合はパラメーターとして宣言されています)。

どちらの場合も、関数はfunction(){ console.log(i2); }次にに渡されsetTimeoutます。

もう1つの同等のもの(ただし、メモリ使用率は少ない)は次のとおりです。

function fGenerator(i2){
    return function(){
        console.log(i2);
    }
}
for(var i = 0; i < 10; i++) {
    setTimeout(fGenerator(i), 1000);
}
10
Ja͢ck 2012-10-17 23:20.

両方の方法を見てみましょう。

(function(){
    var i2 = i;
    setTimeout(function(){
        console.log(i2);
    }, 1000)
})();

setTimeout()独自のコンテキスト内で実行される無名関数を宣言し、すぐに実行します。の現在の値は、最初にiコピーを作成することによって保持されi2ます。すぐに実行されるため、機能します。

setTimeout((function(i2){
    return function() {
        console.log(i2);
    }
})(i), 1000);

内部関数の実行コンテキストを宣言します。これにより、の現在の値が;にi保持されi2ます。このアプローチでは、値を保持するために即時実行も使用します。

重要

実行セマンティクスは両方のアプローチ間で同じではないことに注意してください。あなたの内部関数はに渡されますがsetTimeout()、彼の内部関数はsetTimeout()それ自体を呼び出します。

両方のコードを別のコードでラップしてもsetTimeout()、2番目のアプローチだけがクロージャーを使用していることを証明するものではありません。そもそも同じことはありません。

結論

どちらの方法もクロージャを使用するため、個人的な好みになります。2番目のアプローチは、「移動」または一般化するのが簡単です。

10
Andries 2012-10-17 23:49.

閉鎖

クロージャは関数ではなく、式でもありません。これは、関数スコープ外で使用され、関数内で使用される変数からの一種の「スナップショット」と見なされる必要があります。文法的に、次のように言う必要があります。「変数のクロージャを取ります」。

繰り返しますが、言い換えると、クロージャは、関数が依存する変数の関連するコンテキストのコピーです。

もう一度(naïf):クロージャは、パラメーターとして渡されていない変数にアクセスできます。

これらの機能概念は、使用するプログラミング言語/環境に大きく依存することに注意してください。JavaScriptでは、クロージャは字句スコープに依存します(これはほとんどのC言語に当てはまります)。

したがって、関数を返すことは、ほとんどの場合、匿名/名前のない関数を返すことです。関数がパラメーターとして渡されず、その(字句)スコープ内で変数にアクセスすると、クロージャが実行されます。

だから、あなたの例に関して:

// 1
for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i); // closure, only when loop finishes within 1000 ms,
    }, 1000);           // i = 10 for all functions
}
// 2
for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i; // closure of i (lexical scope: for-loop)
        setTimeout(function(){
            console.log(i2); // closure of i2 (lexical scope:outer function)
        }, 1000)
    })();
}
// 3
for(var i = 0; i < 10; i++) {
    setTimeout((function(i2){
        return function() {
            console.log(i2); // closure of i2 (outer scope)

        }
    })(i), 1000); // param access i (no closure)
}

すべてクロージャーを使用しています。実行ポイントとクロージャを混同しないでください。クロージャの「スナップショット」が間違ったタイミングで取得された場合、値は予期しないものになる可能性がありますが、確かにクロージャが取得されます。

9
Nat Darke 2012-12-22 09:10.

クロージャとは何か、JSでどのように機能するかを思い出すために、少し前にこれを書きました。

クロージャは、呼び出されたときに、呼び出されたスコープではなく、宣言されたスコープを使用する関数です。javaScriptでは、すべての関数がこのように動作します。スコープ内の変数値は、それらを指す関数がある限り存続します。ルールの例外は「this」です。これは、関数が呼び出されたときに関数が内部にあるオブジェクトを指します。

var z = 1;
function x(){
    var z = 2; 
    y(function(){
      alert(z);
    });
}
function y(f){
    var z = 3;
    f();
}
x(); //alerts '2' 
6
Ramesh 2012-10-17 22:58.

よく調べてみると、お二人ともクロージャーを使っているようです。

友達の場合、iは匿名関数1内でi2アクセスされ、console.logが存在する匿名関数2でアクセスされます。

あなたの場合、存在するi2匿名関数の内部にアクセスしていますconsole.log。Chrome開発者ツールのdebugger;console.logと「スコープ変数」の下にステートメントを追加すると、変数がどのスコープの下にあるかがわかります。

4
ekim 2015-03-16 03:56.

次のことを考慮してください。これにより、f閉じる関数が作成および再作成されますが、関数はi異なります!:

i=100;

f=function(i){return function(){return ++i}}(0);
alert([f,f(),f(),f(),f(),f(),f(),f(),f(),f(),f()].join('\n\n'));

f=function(i){return new Function('return ++i')}(0);        /*  function declarations ~= expressions! */
alert([f,f(),f(),f(),f(),f(),f(),f(),f(),f(),f()].join('\n\n'));

以下は「a」関数「itself」を閉じます
(それ自体!この後のスニペットは単一の指示対象を使用しますf

for(var i = 0; i < 10; i++) {
    setTimeout( new Function('console.log('+i+')'),  1000 );
}

またはより明確にするために:

for(var i = 0; i < 10; i++) {
    console.log(    f = new Function( 'console.log('+i+')' )    );
    setTimeout( f,  1000 );
}

注意。の最後の定義ffunction(){ console.log(9) } 0に印刷されます。

警告!クロージャの概念は、基本的なプログラミングの本質からの強制的な気晴らしになる可能性があります。

for(var i = 0; i < 10; i++) {     setTimeout( 'console.log('+i+')',  1000 );      }

x-refs。:JavaScript
JavaScriptクロージャはどのように機能しますか?
Javascriptクロージャの説明
(JS)クロージャには関数内の関数が必要ですか?
Javascriptのクロージャを理解する方法は?[複製]
Javascriptのローカル変数とグローバル変数の混乱[重複]

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

引退した一郎:「私はただ死ぬと思う」

引退した一郎:「私はただ死ぬと思う」

写真:リッチシュルツ/ APマーリンズ外野手/野球のトゥルーヒットキング鈴木一郎は43歳ですが、近い将来、プロ野球をやめるつもりはありません。昨年、彼は143試合に出場し、ヒットしました。

12年後、有名なクラブペンギン氷山がついにヒント

12年後、有名なクラブペンギン氷山がついにヒント

約12年間の運用後、ディズニーの子供向けのMMOクラブペンギンは閉店しますが、プレーヤーがゲームで最も長く実行されているミームの1つを実現する機会を得る前ではありません。氷山がひっくり返った。

安い航空券はあなたが思っているほどお得ではありません

安い航空券はあなたが思っているほどお得ではありません

お気に入りのレストランが割引価格で食事を提供し始めたが、ナプキン、フォーク、または座席が必要な場合は追加料金を支払う必要があるとします。私たちのほとんどはおそらく彼らに私たちのビジネスを与えることを躊躇するでしょうが、その躊躇は航空運賃に変換されません。

注意してください、あなたが話す次の男はUFCファイターかもしれません

注意してください、あなたが話す次の男はUFCファイターかもしれません

マークハントはUFCで最もヘビーな打者かもしれません。彼はほぼ間違いなく、現在オーストラリアに住んでいる最もタフなファイターです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

安全な公衆パニックルーム

安全な公衆パニックルーム

不気味な音に慣れて、コンクリートの周りをうろつきます。痛みや苦い口を吐き出し、「過ち」の不思議な病気を通してもう一度味わうことを切望します。

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

都市の水路を回復する理由はたくさんありますが、気候が変化するにつれて、それらはすべてより持続可能な未来につながります.

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

サンフランシスコの長い間失われた小川を復元する動きが高まっており、コミュニティを地域の生態系と結びつけ、また、都市が気候変動や季節的な洪水に適応するのに役立つ新しいタイプの「グリーン インフラストラクチャ」を作成しています。最新の取り組みは町の 2 つの非常に異なる場所で行われており、それらは明確ではあるが補完的な方法で展開されています。

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

ベイエリアには写真を撮るための美しい屋外スポットがたくさんあります。この記事のすべての写真は、ベイエリアにいるさまざまな PictureHum フォトグラファーとの PictureHum セッションからのものです。

退屈に耐えられないから生きていけない

退屈に耐えられないから生きていけない

それが現代の衝動です — より少ないもので世界を覆し、私たちのほんのわずかな瞬間を自分たちから盗もうとする. 私はかつてダイニングルームのソファで一日を過ごし、祖父母の農家に斜めに差し込む光を眺め、私には関係のない世界について話している大人のつぶやきを半分聞いたり、壁を通してくぐもったテレビを聞いたり、遊んだりしました。床と犬と私の小さな靴を暖めた太陽の黒点と。

Language