在講閉包之前,我們先來複習一下函式
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 這個主題,和大家...