函式的建立有兩種方式:
二者基本等價,除了 什麼時候可通過變數訪問函式的區別,以下將舉例證明。
以函式宣告的方式來建立,那麼不論在什麼時候訪問函式,都是正確的,因為解析器有函式宣告提公升。
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...