對js裡function的length屬性的理解

2021-10-04 12:33:34 字數 1630 閱讀 1863

相信大家對陣列裡的length屬性應該不陌生,它表示陣列元素的個數,但是你有沒有留意過,function裡也有乙個length屬性,下面是我對該屬性的一點理解,希望對大家有所幫助。

它表示該函式的形參個數,我們來看一下下面的例子

function fn(a, b, c) 

console.log(fn.length); // 輸出3

那麼這個length屬性哪來的呢?

因為function它是乙個物件,所以這個length屬性可以往它的原型找

根據原型鏈往上找

console.log(fn.__proto__.length);  // 輸出0
因為函式的形參個數是定義函式時才定的,所以function的原型length值理所當然的為0

再列印一下funtion的length屬性康康

console.log(function.length);   // 輸出1

console.log(fn.__proto__.constructor.length); // 同樣輸出1

至於這裡的length為什麼是1呢?

在這我需要解釋一下:

function這個構造器本身也是乙個函式,它接受至少乙個引數,這個引數便是定義函式後的函式體

比如說:

var fn = new function('return 1+2+3');  // 注意引數型別必須為字串形式

// 等同於

function fn()

// 帶引數的函式寫法

var fn = new function('a', 'b', 'c', 'console.log("我是函式體");return a+b+c'); // 函式體語句之間用分號隔開

// 等同於

function fn(a, b, c)

但是!請注意,這種寫法並不支援閉包哦

例如:

var i = 1;

+function(a, b, c) (1, 2, 3); // 此時函式只能訪問全域性的 i,無法訪問內部的 j

使用function構造器生成的函式,並不會在建立它們的上下文中建立閉包;它們一般在全域性作用域中被建立。當執行這些函式的時候,它們只能訪問自己的本地變數和全域性變數,不能訪問function構造器被呼叫生成的上下文的作用域

害,扯遠了。換台換台!!

再首尾呼應一下:因為構造器function接受至少乙個引數(作為無參函式的函式體),所以它的length列印出來的結果就是 1 啦

寫到這裡有必要區別一下另外乙個東西,那就是 arguments

它表示函式傳入實際引數的個數,注意哦是實參個數

來人!上祖傳栗子!!

fn(1, 2, 3);

function fn(a, b, c)

有小同學可能要舉手了,「欸,老師!這倆不一樣麼???」

「當然不一樣啦」(推眼鏡)

「來人!!再上一顆金牌栗子!!」

fn(1, 2);

function fn(a, b, c)

js裡function的幾種用法

1.最基本的作為乙個本本分分的函式宣告使用。function func 或 var func function 2.作為乙個類構造器使用 function class class.prototype var item new class 3.作為閉包使用 function 4.可以作為選擇器使用 v...

JS 語言的Function 解析

1.最基本的作為乙個本本分分的函式宣告使用。複製 如下 function func 或 var func function 2.作為乙個類構造器使用 複製 如下 function class class.prototype var item new class 3.作為閉包使用 複製 如下 func...

js 中的Function型別

函式的建立有兩種方式 二者基本等價,除了 什麼時候可通過變數訪問函式的區別,以下將舉例證明。以函式宣告的方式來建立,那麼不論在什麼時候訪問函式,都是正確的,因為解析器有函式宣告提公升。sayhello function sayhello 以函式表示式方式來建立,那麼只能在建立之後才能訪問。sayhe...