js 中的Function型別

2021-10-10 11:33:21 字數 2184 閱讀 5086

函式的建立有兩種方式:

二者基本等價,除了 什麼時候可通過變數訪問函式的區別,以下將舉例證明。

以函式宣告的方式來建立,那麼不論在什麼時候訪問函式,都是正確的,因為解析器有函式宣告提公升

sayhello()

;function

sayhello()

以函式表示式方式來建立,那麼只能在建立之後才能訪問。

//sayhello(); 這裡會報錯,sayhello is not a function

//也就是說未定義,下面的**不會執行。

varsayhello

=function()

sayhello()

;//正確

函式名僅僅是乙個指標
var name =

'window'

;var obj =

function

sayname()

sayname()

;//輸出 window

obj.

sayname()

;//輸出 zed

在物件中將外部函式賦值給物件的函式,實際上就是把指向這個函式的指標賦值給乙個空指標,讓它也指向這個函式。而函式的指標,就是函式名。sayname()obj.sayname()指向的是乙個函式。

上面的**sayname: sayname是不加圓括號的,不加圓括號的函式名是訪問函式指標,而非呼叫函式指標。若加上圓括號,則表示的意義是將乙個函式的返回值賦值給另外乙個函式返回值。

沒有過載

js中的函式,是沒有過載的。

function

getsum

(num)

function

getsum

(num)

getsum

(100);

//輸出內容為 300

實際上,同名函式之間,後者會覆蓋前者。

this 和 arguments

每個函式都有這兩個特殊的值。

var name =

'window'

;var obj =

function

sayname()

sayname()

;//輸出 window

sayname.

call

(obj)

;//輸出 zed

function

factorial

(n)return n *

factorial

(n -1)

;}console.

log(

factorial(5

));//120

var func = factorial;

factorial =

null

;

console.

log(

func(5

));//報錯

factirual函式運作正常,但是如果想把這個函式換個名字,就出現了問題。

報錯的原因是遞迴函式中return n * factorial(n - 1),這裡的factirual已經被登出了。

解決的方法很簡單,將遞迴函式體中的函式名換為arguments.callee即可。這樣就減小了函式的耦合度。

返回值為函式

sort()方法需要接收乙個比較函式,這裡就寫乙個示例,了解一下返回值為函式的意義。

var data =[,

,];

data.

sort

(createcomparefunc

('name'))

;//ls,zed,zs

function

createcomparefunc

(proname)

else

if(obj1[proname]

> obj2[proname]

)else

}}

js基礎 function型別

1 函式宣告方式 1 普通宣告方式 function box num1,num2 2 使用變數初始化函式 var box function num1,num2 3 使用function建構函式 var box new function num1 num2 return num1 num2 不推薦 2...

《JS高程》 Function引用型別

答 三種定義方法 答 兩個區別 答 函式名實際是乙個指向函式物件的指標,不會與某個函式繫結。答 函式沒有過載。宣告了兩個同名的函式時,後面的函式將會覆蓋前面的函式,原理為 函式名只是乙個指向函式物件的指標。答 函式可以作為值來使用,不僅可以將乙個函式傳遞給另乙個函式,還可以將乙個函式作為另乙個函式的...

JS中 function 的理解

這種寫法,是一種立即執行函式的寫法,即iife等設計模式。這種函式在函式定義的地方就直接執行了。理解iife設計模式的關鍵是要認識到,在es6之前,j ascript僅具有函式作用域 因此缺少塊作用域 並通過 閉包內部的引用傳遞值。es6之後情況已不再如此,因為j ascript的es6版本使用le...