クローズドCloureとは何ですか?

2087 ワード

クローズドには関数という概念がありますが、表現の核心思想は同じです.たとえば:
言い方一:
クローズド関数:一つの関数の関数をクローズド関数と呼びます.
クローズド:内部関数は常に、その外部関数が返された後でも、その外部関数によって宣言されたパラメータと変数にアクセスできます.
言い方二:
簡単に言えば、クローズドとは、別の関数のスコープにアクセスできる変数の関数です.
MDNは上のように言います.クローズドは特殊な対象です.
二つの部分から構成されています.関数とその関数を作成する環境です.環境はクローズドパッケージ作成時のスコープ内の任意の局所変数から構成される.
このような公式概念は比較的に理解しにくいので、面接の時に話してもあまり専門的ではないです.具体的な論理ができないからです.
個人的には、クローズドの理解の鍵は外部関数の呼び出し後、変数のオブジェクトは破壊されるべきですが、クローズドの存在は、外部関数の変数オブジェクトにアクセスすることができます.これがクローズドの重要な概念です.
閉包とは何ですか?
実は上の二つの言い方は一つの意味です.一つの関数Aはもう一つの関数Bの局所変数にアクセスできます.他の関数Bが実行されても大丈夫です.私は今このような条件を満たす関数Aをクローズドと言います.
クローズド存在の価値と意味?
クローズドバックを適用する主な場合は、プライベートを設計する方法と変数です.
関数で定義された変数は、関数の外部でこれらの変数にアクセスできないので、プライベート変数と見なされます.プライベート変数は、関数のパラメータ、局所変数、関数内で定義される他の関数を含みます.
プライベート変数にアクセスする権限のある共有方法を特権方法といいます.
 
関数名と関数機能範囲を分けるには、関数のthisは、誰がこの関数を呼び出したかを表しています.JSの関数のグローバル呼び出しはwindowです.
JSの中で閉包するのはとても重要な概念です.次の二つの文章を見てください.
面接官は私に聞きました.JavaScriptとは何ですか?どう答えたらいいですか?
閉じて、この1篇を見れば十分です.閉じたカバンの本質を見抜き、百発百中です.
 
kotlinにもCloosureの概念が導入されています.現在のところ、ほぼクローズドされているのが特徴です.
外部関数が実行されるたびに、外部関数の参照アドレスが異なります.新しいアドレスが作成されます.
外部関数を呼び出すたびに、「新しいオブジェクト」があります.それらは互いに干渉しないということを理解します.
    fun closureOuter(x : Int) : (Int) -> Int {
        var a = 3
//        return fun (y : Int) : Int {
//            a++
//            return a + x + y
//        }

        return {y ->
            a++
            a + x + y
        }
    }

    var closureInner0 = closureOuter(3)
    var closureInner1 = closureOuter(13)

    println(closureInner0(3))
    println(closureInner0(3))
    println(closureInner1(3))
    println(closureInner1(3))
kotlinのクローズドとjsはまだ少し違っています.下のコードを見てください.kotlinはこのように書くのが正しいです.jsはこのように書くのが間違いです.jsはもう一つの関数を作って呼び出します.
   fun fn(): Array Unit)?>{
        var arr = arrayOfNulls Unit>(10)
        for (i in 0..9)  {
            arr[i] = fun () {
                println(i)
            }
        }
        return arr
    }

    var arr1 = fn()
    for (item in arr1) {
        item?.invoke()
    }