帶你學習Javascript中的函數進階(一)

来源:https://www.cnblogs.com/lfcss/archive/2020/03/02/12395401.html
-Advertisement-
Play Games

1. 函數的定義和調用 1.1 函數的定義方式 1. 函數聲明方式function關鍵字(命名函數) 1. 函數表達式(匿名函數) 1. new Function() Function裡面參數都必須是字元串格式 第三種方式執行效率低,也不方便書寫,用的比較少 所有函數都是Function的實例(對象 ...


1. 函數的定義和調用

1.1 函數的定義方式

  1. 函數聲明方式function關鍵字(命名函數)
  2. 函數表達式(匿名函數)
  3. new Function()
var fn = new Function('參數1', '參數2',...,'函數體')
  • Function裡面參數都必須是字元串格式
  • 第三種方式執行效率低,也不方便書寫,用的比較少
  • 所有函數都是Function的實例(對象)
//函數聲明方式
function fn() {}

//函數表達式(匿名函數)
var fn = function() {}

//利用new Function('arg1','arg2', 'fn')
var f = new Function('a','b',console.log(a+b)')
f(1,2) // 3

所有的函數都是Function實例對象
image.png

1.2 函數的調用方式

  1. 普通函數
  2. 對象的方法
  3. 構造函數
  4. 綁定事件函數
  5. 定時器函數
  6. 立即執行函數
// 普通函數
function fn() {
    console.log('前端嵐楓博客')
}
fn() //前端嵐楓博客

//對象的方法
var obj = {
    say: function () {
    console.log('前端嵐楓博客')
  }
}
obj.say() //前端嵐楓博客

//構造函數
function Star() {
}
new Star()

//綁定的事件函數
btn.onclick = function() {} //點擊了按鈕就可以調用該函數

//定時器函數
setInterval(function() {}, 1000)

//立即執行函數
(function() {
    console.log('前端嵐楓博客') //自動調用
})()

2. this

2.1 函數內this的指向

這些this的指向,是當調用函數的時候確定的調用方法的不同決定了this的指向不同,一般指向調用者。
調用方式

調用方式 this指向
普通函數調用 window
構造函數調用 實例對象 原型對象裡面的方法也指向實例對象
對象方法調用 該方法所屬對象
事件綁定方法 綁定事件對象
定時器函數
window
立即執行函數 window

2.2 改變函數內部this指向

Javascript為提供了一些函數方法來幫助我們更優雅地處理函數內部this的指向問題,常用的有bind()、call()、apply()三種方法。接下來,我們來詳細的介紹一下這三種方法的用法,看看它們是如何改變this指向的。

  1. call方法

call()方法調用一個對象,簡單理解為調用函數的方式,但是它可以改變函數的this指向。

fn.call(thisArg, arg1, arg2, ...)
var obj = {
        name: 'lanfeng'
}
function fn(a, b) {
    console.log(this) 
  console.log(a+b) 
}
fn(1,2)//指向window, 3
fn.call(obj, 1, 2) //指向obj, 3

//實現繼承
function Father(uname, age, sex) {
    this.uname = uname
  this.age = age
  this.sex = sex
}
function Son () {
    Father.call(this,uname, age, sex)
}
var son = new Son('柳岩',18,'女')

call:第一個可以調用函數,第二個可以改變函數內的this指向
call的主要作用可以實現繼承

  1. apply方法

apply()方法調用一個函數。簡單理解為調用函數的方式,它與call方法一樣可以改變函數的this的指向,但是它跟call傳參數方式不一樣,它是傳的參數必須在一個數組裡

fun.apply(thisArg, [argsArray])
  • thisArg:在fun函數運行時指定this的值
  • argsArray: 傳遞的值,必須包含在數組裡面
  • 返回值就是函數的返回值,因為它就是調用函數
var obj = {
        name: 'lanfeng'
}
function fn(a, b) {
    console.log(this) 
  console.log(a+b) 
}
fn(1,2)//指向window, 3
fn.apply(obj, [1, 2]) //指向obj, 3

apply:第一個可以調用函數,第二個可以改變函數內的this指向
apply的參數必須時數組(偽數組)
apply的主要應用,求數數組中的最大值,最小值

var arr = [1, 66, 3, 99, 4]
var max = Math.max.apply(Math, arr) 
var min = Math.min.apply(Math, arr) 
console.log(max, min) //99 1
  1. bind方法

bind()方法不會調用函數,但是能改變函數內部this指向

fn.bind(thisArg, arg1, arg2, ...)
  • thisArg: 在fn函數運行時指定的this值
  • arg1, arg2: 傳遞的其他參數
  • 返回由指定的this值和初始化參數改造的原函數拷貝
var obj = {
        name: 'lanfeng'
}
function fn(a, b) {
    console.log(this) 
  console.log(a+b) 
}
fn(1,2)//指向window, 3
var f = fn.bind(obj, 1, 2)
f()

bind: 不會調原來的函數,可以改變this指向,返回的函數是改變this之後產生的新函數
bind的應用: 如果有的函數我們不需要立即調用,但是又想改變這個函數內部的this指向此時用bind

var btn = document.querySelector('button')
//以前的用法
btn.onclick = function() {
  var that = this
    this.disabled = true
  setTimeout(function(){
    that.disabled = false
  }, 3000)
}

// bind用法
btn.onclick = function() {
    this.disabled = true
  setTimeout(function(){
    this.disabled = false
  }.bind(this), 3000)
}

2.3 call apply bind 總結

相同點:
都可以改變函數內部的this指向
區別點:

  1. call 和apply 會調用函數,並且改變函數內部的this指向
  2. call和apply傳遞的參數不一樣,call傳遞參數形式arg1, arg2, ...形式,apply必須數組形式
  3. bind不會調用函數,可以改變函數內部的this指向

主要應用場景:

  1. call經常做繼承
  2. apply經常跟數組有關係,比如藉助於數學對象實現數組的最大值最小值
  3. bind不調用函數,但是還想改變this指向,比如改變定時器的內部this指向

    總結

    本篇文章主要分享了javascript的函數定義、用法、this及改變this指向的幾種方法、如想瞭解更多,請掃描二維碼:
    qrcode_for_gh_4d3763fa9780_258 (1).jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 選中Element的方式 1、getElementById() 2、getElementsByClassName() 3、getElementsByTagName() 4、querySelector() //返回指定選擇器的第一個元素 5、querySelectorAll() //返回指定選擇器 ...
  • css層疊樣式表、css樣式由選擇符和聲明組成,而聲明又由屬性和值組成,/*選擇符{屬性:值}選擇符=>選擇器、{屬性:值}=>聲明*/ ,css/*註釋語句*/來標明(html中使用);css樣式代碼插入頁面的形式分為以下3種:內聯式、嵌入式(外聯式)和外部式三種!對於同一個元素我們同時用了三種方... ...
  • 楔子 需求一:有html標簽關係如下,請找到所有的含有a標簽的li標簽 <div <ul <li class="city" 北京</li <li class="city" <a href="" 上海</a </li <li class="city" 天津</li </ul </div <script ...
  • javascript介紹 Web前端有三層: HTML:從語義的角度,描述頁面結構 CSS:從審美的角度,描述樣式(美化頁面) JavaScript:從交互的角度,描述行為(提升用戶體驗) 其中JavaScript基礎又分為三個部分: ECMAScript:JavaScript的語法標準。包括變數、 ...
  • web標準介紹 web標準: w3c:萬維網聯盟組織,用來制定web標準的機構(組織) web標準:製作網頁遵循的規範 web標準規範的分類:結構標準、表現標準、行為標準。 結構:html。表示:css。行為:Javascript。 總結說明: 結構標準:相當於人的骨架。html就是用來製作網頁的。 ...
  • rgba與opacity 在第一個例子中,我們只讓背景顏色變得透明,而第二個例子用到opacity屬性,讓整個元素都變得透明,包含元素中含的內容。 使用opacity把一個元素設置為透明後,將無法再讓其子元素變得不那麼透明。 body{ background-color: rgba(254,219, ...
  • 直接上代碼 <el-table :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)" border style="width: 100%"> <el-table-column type="selection">< ...
  • 1.如何安裝Vbox與U8 安裝包下載:鏈接: https://pan.baidu.com/s/1w8r7kyIJaT8ir dXwEe4tA 提取碼: 1888 裡面有個教程跟著教程一步一步來!!! 全部下載 雙擊安裝 先解壓好之前下載的那個win7 64 001 點擊導入 導入之前解壓出來的wi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...