JavaScript函數(shù)全解

1.函數(shù)聲明

JavaScript函數(shù)有匿名函數(shù)、具名函數(shù)和箭頭函數(shù)三種。

匿名函數(shù)
let fn = function () {
  return 1
} //引用匿名函數(shù)的地址
let fn2 = fn //引用匿名函數(shù)地址
console.log(fn.name) //fn
console.log(fn2.name) //fn

函數(shù)就是對象,對象存在堆內(nèi)存里面。匿名函數(shù)的函數(shù)名就是引用它的變量的名字。

具名函數(shù)
function fn3() {
  return 3
}
console.log(fn3.name)  //fn3

let fn5 = function fn4() {
  return 4
}
console.log(fn4.name) //Uncaught ReferenceError: fn4 is not defined
console.log(fn5.name) //fn4

fn3的作用域的全局,fn5引用了fn4,所以fn4的作用域是函數(shù)本身。

箭頭函數(shù)
let fn6 = i => i + 1  //一個參數(shù)寫法
let fn7 = (i, j) => {  //多個參數(shù)寫法
  console.log(i, j)
  return i + j;
}

箭頭函數(shù)沒有name,但是箭頭函數(shù)沒有this

2.詞法作用域(靜態(tài)作用域)

靜態(tài)作用域又叫做詞法作用域,采用詞法作用域的變量叫詞法變量。詞法變量有一個在編譯時靜態(tài)確定的作用域。詞法變量的作用域可以是一個函數(shù)或一段代碼,該變量在這段代碼區(qū)域內(nèi)可見(visibility);在這段區(qū)域以外該變量不可見(或無法訪問)。詞法作用域里,取變量的值時,會檢查函數(shù)定義時的文本環(huán)境,捕捉函數(shù)定義時對該變量的綁定?!揪S基百科】

var global1 = 1  //全局變量
function fn1(param1){
  var local1 = 'local1'  //局部變量 
  var local2 = 'local2'  //局部變量
  function fn2(param2){
    var local2 = 'inner local2'  //局部變量
    console.log(local1)
    console.log(local2)
  }
  function fn3(){
    var local2 = 'fn3 local2'  //局部變量
    fn2(local2)
  }
  fn2() 
  //local1
  //inner local2
  fn3()
  //local1
  //inner local2
}
fn1()
詞法樹

詞法樹只能確定變量的關系,不能確定變量的值。

3.this和arguments

this 就是 call 的第一個參數(shù)!call 的其他參數(shù)統(tǒng)稱為 arguments
call才是正常的函數(shù)調(diào)用,其他調(diào)用函數(shù)的方式都是語法糖。

function f(){
  console.log(this)
  console.log(arguments)
}
f.call() // window,相當于f.call(undefined)
f.call({name:'frank'}) // {name: 'frank'}, []
f.call({name:'frank'},1) // {name: 'frank'}, [1]
f.call({name:'frank'},1,2) // {name: 'frank'}, [1,2]

this 是隱藏的第一個參數(shù),且一般是對象,用于占位。arguments是偽數(shù)組,第二到最后一個參數(shù)都放里面,如果只有一個參數(shù)就為[]。

4.call、apply和bind

fn.call(asThis, p1,p2) 是函數(shù)的正常調(diào)用方式
當你不確定參數(shù)的個數(shù)時,就使用 apply
fn.apply(asThis, params)

call 和 apply 是直接調(diào)用函數(shù),而 bind 則是返回一個新函數(shù)(并沒有調(diào)用原來的函數(shù)),這個新函數(shù)會 call 原來的函數(shù),call 的參數(shù)由你指定。

5.函數(shù)柯里化

函數(shù)柯里化就是只傳遞給函數(shù)一部分參數(shù)來調(diào)用它,讓它返回一個函數(shù)去處理剩下的參數(shù)。(返回函數(shù)的函數(shù))

//柯里化之前
function sum(x,y){
  return x+y
}
//柯里化之后
function addOne(y){
  return sum(1, y)
}
//柯里化之前
function Handlebar(template, data){
  return template.replace('{{name}}', data.name)
}
//柯里化之后
function Handlebar(template){
  return function(data){
    return template.replace('{{name}}', data.name)
  }
}

6.高階函數(shù)

在數(shù)學和計算機科學中,高階函數(shù)是至少滿足下列一個條件的函數(shù):
a.接受一個或多個函數(shù)作為輸入:forEach sort map filter reduce,
b.輸出一個函數(shù):lodash.curry,
c.不過它也可以同時滿足兩個條件:Function.prototype.bind

7.回調(diào)函數(shù)

被當做參數(shù)的函數(shù)就是回調(diào)函數(shù)(調(diào)用這個回調(diào)),回調(diào)跟異步?jīng)]有任何關系。

//同步回調(diào)
array.sort.call(array, fn)
array.forEach.call(array, fn)
array.map.call(array, fn)
array.filter.call(array, fn)
array.reduce.call(array, fn)
//異步回調(diào)
setTimeout(fn, 1000)

8.構(gòu)造函數(shù)

返回對象的函數(shù)就是構(gòu)造函數(shù),一般首字母大寫。

new Number(1)
new String('s')

function Empty(){
  this.name = 'null'
  return this
}
var empty = new Empty  //Empty.call({})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 0.0 概述 本文總結(jié)了js中函數(shù)相關的大部分用法,對函數(shù)用法不是特別清晰的同學可以了解一下。 1.0 簡介 同其...
    hard_man閱讀 1,020評論 0 2
  • JavaScript的相關語法知識:1、函數(shù)(important)基本上所有的高級語言(C、OC、JavaScri...
    天山雪蓮_38324閱讀 702評論 0 2
  • 函數(shù)就是最基本的一種代碼抽象的方式。 定義函數(shù)function abs(x) {if (x >=0){return...
    _我和你一樣閱讀 509評論 0 0
  • 前言:本文將詳細的介紹JS中函數(shù)的相關概念(包括函數(shù)的call stack 、this 、作用域、閉包、柯里化、高...
    EnochQin閱讀 719評論 2 2
  • 函數(shù) 聲明式函數(shù) 表達式函數(shù) 立即執(zhí)行函數(shù) 此類函數(shù)沒有聲明,在一次執(zhí)行后即釋放,瀏覽器再也找不到這個函數(shù)的引用,...
    涙_閱讀 245評論 0 0

友情鏈接更多精彩內(nèi)容