相信大家對陣列裡的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...