javascript函數如何定義? js函數常見用法
這篇文章帶給大家的內容是關於javascript函數如何定義? js函數常見用法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
我們知道,js函數有多種寫法,函數聲明,函數表達式,Function式建構函數,自執行函數,包括Es6的箭頭函數,Class類寫法,高階函數,函數節流/函數防手震,下面我就開始講關於上面幾種類型的最基本用法。
函數宣告式寫法
這個寫法是最基本的寫法,使用關鍵字 function 定義函數,函數宣告後不會立即執行,會在我們需要的時候呼叫到。這種函數是全域的,如果有兩個同名的宣告式函數存在,那麼第二個就會覆寫第一個。
function Test(){ }
有個面試題如下,問輸出:
function test1(){ alert('test1') } ; test1() ; function test1(){ alert('test2') } ;
答案是:'test2'
函數表達式寫法
定義一個變量,指向一個函數,其實可以看做是一個匿名函數。這種函數在宣告之後才能調用,在宣告之前調用會報錯。
var test=function(){ }
有個面試題如下,問輸出:
var test=function(){ alert('test1') } ; test() ; var test=function(){ alert('test2') } ;
答案是:test1
Function式建構子
透過 JavaScript 函數建構器(Function ())實例化來定義函數,前面定義各種變量,最後定義函數的回傳值或輸出,這種函數較不常用。
var test= new Function("a", "b", "return a * b"); test();
自執行函數
這個函數沒有名稱,只有宣告體,實際上是一個 匿名自我呼叫的函數。這種函數的好處是保持變數獨立,不被外在變數污染,形成一個封閉的函數執行環境。
寫法如下:
(function(){ })(); 这种写法比较常见,比如Jquery框架里面就用到这种写法: ‘use strict’; ;(function(context,win){ })(Jquery||undefined,window)
還有像閉包的寫法,常常會遇到像下面類似的面試題的寫法:
var ps=tr.getElementsByTagName("p"); for(var i=0;i<ps.length;i++){ (function(p){ p.onclick=function(){ alert(this.innerHTML); } })(ps[i]) }
箭頭函數
這種宣告方式是Es6引入的寫法,箭頭函數是簡寫形式的函數表達式,並且它的內部的this指向的不是自己,指向的是當前執行環境的頂級對象(如window,react元件中指向的是目前元件的class父級元件),箭頭函數總是匿名的。寫法如下:
const test=()=>{ }
例如下面的函數中的this指向的是window
const test={ array:[1,2], show:()=>{ console.log(this. array) } } test.show();//undefined
而下面react元件的onSearch中的this指向的是Test這個元件,透過this可以找到Test元件下面定義的函數或state,props。注意constructor中註解的程式碼是為了將onSearch的this指向Test元件,和箭頭函數是兩個不同寫法,但是有同等效果。
import {Button} from 'antd' class Test extends Component { constructor(props) { super(props); //this.onSearch = this.onSearch.bind(this) } //onSearch(){ console.log(this); //} onSearch=()=>{ console.log(this); } render() { return ( < p > <Button onClick={this.onSearch}>测试</Button> < /p> ) } }
Class類別寫法
#Js之前是沒有類別的概念的,之前都是將一些屬性掛載在函數的實例上或透過原型來實現基於函數的類別的概念。就例如下面的寫法
function Test (){ this.name=’’; //this.show=function(){ //} } Test.prototype.show=function(){ Console.log(this.name) } new Test().show();
ES6引入了Class(類別)這個概念,作為物件的模板,透過class關鍵字,可以定義類別。基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓物件原型的寫法更加清晰、更像物件導向程式設計的語法.
基本寫法:
class test { //第一种 Show() { alert('show'); } //第二种 //Show=()=>{ //} } var test1 = new test(); var test2= new test();
注意這個類別中的這兩種方法的寫法是有區別的
第一種宣告的方法會指向test的原型prototype上
test1. Show=== test2.Show//true
第二種宣告的方法會指向test的實例,每次實例化都會產生一個Show方法。
test1. Show=== test2.Show//false
繼承寫法如下,這樣newTest 就會繼承test中的Show
class newTest extends test{ Show() { super. Show(); alert('newshow'); } } var test=new newTest (); test. Show()
如果newTest 中沒有宣告Show方法,就會呼叫父類別test中的Show方法,如果申明了就會呼叫newTest 的Show方法。子級呼叫父級的方法用super關鍵字存取如
super. Show();
#高階函數
高階函數英文叫Higher-order function。 JavaScript的函數其實都指向某個變數。既然變數可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作為參數,而這個函數就稱之為高階函數。簡單的說法就是“高階函數就是可以把函數作為參數,或者是將函數作為返回值的函數。”,其實最典型的應用就是回調函數了。
高階函數大致上有下面幾個場景
1.函數回呼
$.get(‘’,{},function(data){ }) var test=function(callback){ callback.apply(this,arguments) }
2函數柯里化
在一個函數中先填幾個參數(然後再回傳一個新函數)的技術稱為柯里化(Currying),這個定義可能有點難理解,先看下一個簡單的函數柯里化的實現:
var currency=function(fn){ var self=this; var arr=[]; return function(){ if(arguments.length==0){ return fn.apply(this,arr ); }else{ [].push.apply(arr,arguments); return arguments.callee; } } }
然後再看一下呼叫:
var sum=function(){ var total=0; var argArr=arguments; for (var i = 0; i < argArr.length; i++) { total+=argArr[i]; } return total; } var test= currency(sum); test(100,200); test(300) alert(test());
其实简单的解释就是currency函数里面定义一个局部变量arr数组,然后返回一个函数,返回的函数体里对变量arr进行了赋值,每次当函数传入参数的时候都会将参数push到arr里面,然后返回函数体,形成了一个闭包。当没有参数传入的时候就直接执行传入的sum函数,然后执行函数sum传入的的参数就是arr.
3.函数扩展
函数扩展一般是通过原型来扩展,传入一个回调函数,比如给Array扩展一个函数Filter代码如下:
Array.prototype.Filter=function(callback){ ….. }
做过react 开发的都知道有高阶组件的概念,其实高阶组件是通过高阶函数演变的,只不过传入的参数是组件,然后返回值是一个组件,来看下面的一段代码
export default simpleHoc(Usual); import React, { Component } from 'react'; const simpleHoc = WrappedComponent => { console.log('simpleHoc'); return class extends Component { render() { return <WrappedComponent {...this.props}/> } } } export default simpleHoc;
函数节流/函数防抖
一般做前端时间比较长的人对这个概念比较熟了,但是刚接触的人估计会有点懵逼。
这两个概念都是优化高频率执行js代码的一种手段,来看下他们的基本概念
函数节流:函数在设定的时间间隔内最多执行一次
应用场景:高频率点击事件
var isEnable=true; document.getElementById("testSubmit").onclick=function(){ if(!isEnable){ return; } isEnable=false; setTimeout(function(){ console.log("函数节流测试"); isEnable = true; }, 500); }
函数防抖:函数在一段时间内不再被调用的时候执行
应用场景:onresize onscroll事件,oninput事件
Var timer=null; Window. onscroll=function(){ clearTimeout(timer); timer = setTimeout(function(){ console.log("函数防抖测试"); }, 500); }
从上面两个事件可以看出来区别:
函数节流在第一次操作之后的500毫秒内再次点击就只执行一次,不会重置定时器,不会重新计时
函数防抖是在持续触发onscroll事件的时候会重置重置定时器,重新计时,直到不触发事件的500毫秒之后执行一次
以上是javascript函數如何定義? js函數常見用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript函數非同步程式設計:處理複雜任務的必備技巧引言:在現代前端開發中,處理複雜任務已經成為了必不可少的一部分。而JavaScript函數非同步程式設計技巧則是解決這些複雜任務的關鍵。本文將介紹JavaScript函數非同步程式設計的基本概念和常用的實作方法,並提供具體的程式碼範例,幫助讀者更好地理解和使用這些技巧。一、非同步程式設計的基本概念在傳統的同步程式設計中,程式碼按

在現代Web應用程式中,實現網頁導航與路由是十分重要的一環。利用JavaScript的函數來實現這個功能,可以讓我們的網路應用程式更加靈活、可擴展且使用者友好。本文將介紹如何使用JavaScript函數來實現網頁導航和路由,並提供具體的程式碼範例。實現網頁導航對於一個Web應用程式而言,網頁導航是使用者操作最頻繁的一個部分。當使用者點擊頁面上的

使用JavaScript函數實現資料視覺化的即時更新隨著資料科學和人工智慧的發展,資料視覺化已經成為了一種重要的資料分析和展示工具。透過視覺化數據,我們可以更直觀地理解數據之間的關係和趨勢。在Web開發中,JavaScript是一種常用的腳本語言,具備強大的資料處理和動態互動功能。本文將介紹如何使用JavaScript函數實現資料視覺化的即時更新,並展示具體

JavaScript是一種腳本語言,可以用來為網頁加入互動效果。其中,圖片輪播和投影片效果是常見的網頁動畫效果,本文將介紹如何使用JavaScript函數實現這兩種效果,並提供具體程式碼範例。圖片輪播圖片輪播是一種將多張圖片依照一定的方式輪流播放的效果。在實作圖片輪播時,需要用到JavaScript的定時器和CSS樣式控制。 (1)準備工作首先,在HTML文件中

使用JavaScript函數實現使用者登入和權限驗證隨著互聯網的發展,使用者登入和權限驗證成為了許多網站和應用程式必備的功能。為了保護使用者的資料安全和存取權限,我們需要使用一些技術和方法來驗證使用者的身份,並限制其存取的權限。 JavaScript作為一種廣泛使用的腳本語言,在前端開發中扮演著重要的角色。我們可以利用JavaScript函數來實現使用者登入和權限驗證功

使用JavaScript函數實現文件上傳和下載隨著互聯網的發展和普及,文件上傳和下載成為了網頁應用中常見的功能之一。本文將介紹如何使用JavaScript函數來實作檔案上傳和下載的功能,並提供具體的程式碼範例。文件上傳文件上傳指的是將本機的文件透過網頁上傳到伺服器。 HTML5中提供了FileAPI用於處理文件的選擇和上傳。我們可以利用FileAPI中的Fi

使用JavaScript函數實現使用者互動和動態效果隨著現代網頁設計的發展,使用者互動和動態效果成為了吸引使用者眼球的關鍵。 JavaScript作為一種常用的腳本語言,具有強大的功能和靈活的特性,能夠實現各種各樣的使用者互動和動態效果。本文將介紹一些常見的JavaScript函數,並給出具體的程式碼範例。改變元素樣式(style)透過JavaScript函數能夠輕鬆改

使用JavaScript函數實現資料視覺化的動態更新資料視覺化是大數據時代中非常重要的一環,它能夠以直覺的方式展示數據,幫助人們更好地理解和分析數據。而JavaScript作為一種客戶端的腳本語言,能夠透過函數的方式來實現資料視覺化的動態更新。本文將介紹如何使用JavaScript函數來實現此功能,並提供具體的程式碼範例。一、資料視覺化基礎在開始編寫程式碼之前
