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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

ジョエル・マクヘイル、マイク・コルター(スクリーンショット:Netflix)「私の神よ、これは1つのことを変えます。」これは、ジョエル・マクヘイルとのジョエル・マクヘイルショーの最後のジョークです。リアリティ番組の嘲笑と寛大なスナキネスの時間は、なじみのある顔を見つけます。

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

画像経由:@pancakeparadox(Twitter)。1997年にポケモンシリーズが初公開されて以来、チームロケット(またはラテンアメリカではチームロケット)として知られる悪役のグループは、何度もアッシュに直面してきました。

今週の科学技術でトランプがめちゃくちゃになったことすべて

今週の科学技術でトランプがめちゃくちゃになったことすべて

画像:ゲッティ私たち全員が千年もの間生きていて、私たちの体が燃える風によってほこりと長引く悲鳴だけに押し流されたと考えるのは驚くべきことです。私たちがそうしていないことを除いて、それはトランプ政権の最初の週の終わりであり、驚くほど多くの恐ろしいことがすでに起こっています。

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

そして今、あることを手に入れていると思っていたが、まったく別のことをしてしまった男の話。CBSニュースは、彼女が「ミニブタ」であるという誤ったふりをしてエスターを養子にしたカナダ人のスティーブジェンキンスの心温まる物語をもたらします。これは、特にせいぜいゴールデンレトリバーまたはセントバーナードをストラップします。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language