閉包 其實很簡單

2021-09-11 17:00:19 字數 1351 閱讀 7999

在講閉包之前,我們先來複習一下函式

1.函式的宣告

我們知道函式的宣告有三種:

1. function

f1()

2. var f2 = function

() 3. var f3 = new function('console.log(3)') //這一種由於很不直觀,所以很少使用

複製**

2.函式的作用域

作用域:

就是這個變數存在的範圍,出了這個範圍,就沒辦法找到這個變數了。 如

function

f1()

console.log(a) //referenceerror: a is not defined

變數a的作用域在函式f1內部,所以在函式f1外部去讀取這個變數是讀取不到的

複製**

js作用域:
1. 全域性作用域,在任何地方都可以讀取

2. 函式作用域,只在函式體內部可以讀取

3. 塊級作用域

複製**

那麼,函式本身也是乙個值,他也是有作用域的。

劃重點: 函式的作用域與變數一樣,是函式宣告時所在的作用域,跟函式在哪兒執行是沒有關係的。

舉個例子:

var a = 22;

var f1 = function

() function

f2 ()

f2() // 22

複製**

以上**中,為什麼列印出的是22而不是33呢? 因為函式在全域性環境宣告,作用域是全域性,所以去取a的時候,在自己的作用域裡面發現沒有a,就往上找a,就找到了全域性的a

再看個例子:

function

f1()

return f2;

}var x = 33;

var f3 = f1();

f3() // 22

複製**

以上**中,變數x是在函式f1內部的,可是為什麼我們在函式外部取到了他的值呢? 那就是因為 我們利用了f2函式。

f2函式是在f1內部宣告的,他是可以取到f1內部的變數x的值的,因為我們的作用域鏈就是一層層往上,

我們將f2函式return 出去之後,再執行他,

他會記住自己的作用域,所以在執行f2函式的時候,他就可以將變數x的值列印出來了。

因此 我們就可以在外部讀到這個變數的值了。

以上 函式 f2就是閉包。

閉包,其實就是 可以讀取其他函式內部變數的函式。

只有函式內部的子函式才可以讀取內部的變數,所以 也可以簡單把閉包理解為,「定義在乙個函式內部的函式」

閉包 其實很簡單

在講閉包之前,我們先來複習一下函式 1.函式的宣告 我們知道函式的宣告有三種 1.function f1 2.var f2 function 3.var f3 new function console.log 3 這一種由於很不直觀,所以很少使用 複製 2.函式的作用域 作用域 就是這個變數存在的範...

閉包 其實很簡單

在講閉包之前,我們先來複習一下函式 1.函式的宣告 我們知道函式的宣告有三種 1.function f1 2.var f2 function 3.var f3 new function console.log 3 這一種由於很不直觀,所以很少使用 複製 2.函式的作用域 作用域 就是這個變數存在的範...

LINQ其實很簡單

會寫這一篇是有原因的,不只一次有人問我,要不要學 linq呢?linq 看起來很難耶 為何要放棄以前的 sql來學 linq呢?到底linq 的意義是什麼 反正就是有很多的問題,說真的,由於最近也沒時間寫本 linq 的書,但是工作累了順手寫寫 blog 還可以,所已針對 linq 這個主題,和大家...