javascript
JavaScript Function中你可能不知道的知识点
目錄
函數的聲明
函數的屬性與特性??
函數作用域
函數參數的傳遞方式
arguments 對象
閉包
函數是一段可以反復調用的代碼塊。函數還能接受輸入的參數,不同的參數會返回不同的值。
函數的聲明
- function命令
 
- ?函數表達式
 
- ?Function 構造函數
 
?你可以傳遞任意數量的參數給Function構造函數,只有最后一個參數會被當做函數體,如果只有一個參數,該參數就是函數體。
函數的屬性與特性??
- name屬性
 
函數的name屬性返回函數的名字。
function f1() {} f1.name // "f1"// 如果是通過變量賦值定義的函數,那么name屬性返回變量名。 var f2 = function () {}; f2.name // "f2"- ?leng屬性
 
函數的length屬性返回函數預期傳入的參數個數,即函數定義之中的參數個數。
function f(a, b) {} f.length // 2不管調用時傳入多少個參數,leng屬性值始終等于2,length屬性就是定義時的參數個數,與調用無關。
- 函數名提升
 
JavaScript 引擎將函數名視同變量名,所以采用function命令聲明函數時,整個函數會像變量聲明一樣,被提升到代碼頭部。所以,下面的代碼不會報錯。
f();function f() {}函數作用域
作用域分全局作用域 和 函數作用域,全局作用域,變量在整個程序中一直存在,所有地方都可以讀取;函數作用域,變量只在函數內部存在。
- 在函數內部定義的變量,外部無法讀取,稱為“局部變量”。
 
- 函數內部定義的變量,會在該作用域內覆蓋同名全局變量。
 
- 函數作用域內部也會產生“變量提升”現象。var命令聲明的變量,不管在什么位置,變量聲明都會被提升到函數體的頭部
? - ?函數本身也是一個值,也有自己的作用域。就是其聲明時所在的作用域,與其運行時所在的作用域無關(與調用無關)。
 
函數參數的傳遞方式
- 函數參數如果是原始類型的值(數值、字符串、布爾值),傳遞方式是傳值傳遞
 
這意味著,在函數體內修改參數值,不會影響到函數外部。
var p = 2;function f(p) {p = 3; } f(p);p // 2- ?函數參數是復合類型的值(數組、對象、其他函數),傳遞方式是傳址傳遞。
 
也就是說,傳入函數的原始值的地址,因此在函數內部修改參數,將會影響到原始值。
var obj = { p: 1 };function f(o) {o.p = 2; } f(obj);obj.p // 2?如果函數內部修改的,不是參數對象的某個屬性,而是替換掉整個參數,這時不會影響到原始值。
var obj = [1, 2, 3];function f(o) {o = [2, 3, 4]; } f(obj);obj // [1, 2, 3]這是因為,形式參數(o)的值實際是參數obj的地址,重新對o賦值導致o指向另一個地址,保存在原地址上的值當然不受影響。
就是說 o 其實作為參數代表數組 [1,2,3] 的地址,又被賦予了 [2,3,4] 的地址,所以不會影響到 obj。
arguments 對象
- 由于 JavaScript 允許函數有不定數目的參數,所以需要一種機制,可以在函數體內部讀取所有參數。這就是arguments對象的由來。
 
arguments對象包含了函數運行時的所有參數,arguments[0]就是第一個參數,arguments[1]就是第二個參數,以此類推。這個對象只有在函數體內部,才可以使用。
- 雖然arguments很像數組,但它是一個對象。數組專有的方法(比如slice和forEach),不能在arguments對象上直接使用。
? - arguments對象帶有一個callee屬性,返回它所對應的原函數。
 
閉包
理解閉包,首先必須理解變量作用域。前面提到,JavaScript 有兩種作用域:全局作用域和函數作用域。函數內部可以直接讀取全局變量。但是函數外部無法讀取函數內部聲明的變量。出于種種原因,需要得到函數內的局部變量。正常情況下,這是辦不到的,只有通過變通方法才能實現。那就是在函數的內部,再定義一個函數。
function f1() {var n = 999;function f2() {console.log(n);}return f2; }var result = f1(); result(); // 999上面代碼中,函數f1的返回值就是函數f2,由于f2可以讀取f1的內部變量,所以就可以在外部獲得f1的內部變量了。
閉包就是函數f2,由于在 JavaScript 語言中,只有函數內部的子函數才能讀取內部變量,因此可以把閉包簡單理解成“定義在一個函數內部的函數”。
閉包的最大用處用兩個:
為什么閉包能夠返回外層函數的內部變量:
閉包用到了外層變量,導致外層函數不能從內存釋放。只要閉包沒有被垃圾回收機制清除,外層函數提供的運行環境也不會被清除,它的內部變量就始終保存著當前值,供閉包讀取。
總結
以上是生活随笔為你收集整理的JavaScript Function中你可能不知道的知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 如何评价谭浩强(转自知乎)
 - 下一篇: NFC天线工作原理、设计