主頁 > 企業開發 > 帶你學習javascript的函式進階(二)

帶你學習javascript的函式進階(二)

2020-10-01 16:44:46 企業開發

1 嚴格模式

1.1 什么是嚴格模式

JavaScript除了提供正常模式外,還提供了嚴格模式(strict mode),ES5的嚴格模式是采用具有限制性Javascript變體的一種方式,即在嚴格的條件下運行js代碼,
嚴格模式在IE10以上版本的瀏覽器中才會被支持,舊版本瀏覽器會被忽略,
嚴格模式對正常的javascript語意做了一些更改:

  1. 消除了Javascrip語法的一些不合理、不嚴謹之處,減少了一些怪異行為,
  2. 消除了代碼運行的一些不安全之處,保證代碼運行的安全,
  3. 提高編譯器效率,增加運行速度,
  4. 禁用了在ECMAScript的未來版本中可能會定義的一些語法,為未來新版本的Javascript做好鋪墊,比

如一些保留字:class,enum,export,extends,import,super不能做變數,

1.2 開啟嚴格模式

嚴格模式可以應用到整個腳本或個別函式中,因此在使用時,我們可以將嚴格模式分為腳本開啟嚴格模式和
為函式開啟嚴格模式兩種情況

  1. 為腳本整個腳本開啟嚴格模式

為整個腳步檔案開啟嚴格模式,需要在所有陳述句之前做一個特定陳述句"use strict"

<scirpt>
  "use strict"
	console.log("這是最嚴格模式")
 </scirpt>
  1. 為函式開啟嚴格模式

要給某個函式開啟嚴格模式,需要把"use strict";(或'use strict')宣告放在函式體所有陳述句前,

<script>
 	function fn() {
		'use strict' //下面的代碼按照嚴格模式進行
	} 
 </script>

3.3 嚴格模式中的變化

嚴格模式對javascript的語
法和行為,都做了一些改變

  1. 變數規定
  • 在正常模式中,如果一個變數沒有宣告就賦值,默認的事全域變數,
  • var 命令宣告,然后再使用
<script>
  ‘use strict’
	num = 10
	console.log(num)
 </script>

效果如下圖
image.png
嚴禁洗掉已經宣告的變數,

  1. 嚴格模式下this指向問題
  • 以前在全域作用域函式中的this指向window物件,
  • 嚴格模式下全域作用域中函式中的this事undefined,
  • 以前建構式時不加new也可以呼叫,當普通函式,this指向全域物件,
  • 嚴格模式下,如果建構式不加new呼叫,this會報錯, new實體化的建構式指向創建的物件實體,
  • 嚴格模式下,定時器里的this指向還是window.
  • 嚴格模式下,事件、物件還是指向呼叫者,
  1. 函式變化
  • 嚴格模式下函式不能有重名的引數
  • 函式必須宣告在頂層,新版本的js會引入“塊級作用域”(ES6中已引入),為了與新版本接軌,不允許在非函式的代碼塊內宣告函式,如在if,for陳述句中宣告函式,

2 高階函式

高階函式是對其他函式進行操作的函式,它接收函式作為引數或函式作為回傳值輸出,

function fn(callback) {
	callback && callback()
}
fn(function(){
	alert('lanfeng')
})
function fn() {
	return function() {
  }
}
fn()

此時fn就是一個高階函式
函式也是一種資料型別,同樣可以作為引數,傳遞給另外一個引數使用,最典型的就是作為回呼函式

3 閉包

3.1 變數作用域

變數根據作用域的不同分為兩種:全域變數和區域變數,

  1. 函式內部可以使用全域變數
  2. 函式外部不可以使用區域變數
  3. 當函式執行完時,本作用域內的區域變數會被銷毀,

3.2 什么是閉包

閉包指有權訪問另外一個函式作用域中變數的函式,也就是說,一個作用域可以訪問另外一個函式內部的區域變數,

//fn 外面的作用域可以訪問fn內部的區域變數
function fn() {
	var num = 10
  function fun () {
  	console.log(num) //可以訪問num
  }
  return fun
}
var f = fn()
f() //10
//fn 外面的作用域可以訪問fn內部的區域變數
function fn() {
	var num = 10
  
  // 回傳一個匿名函式
  return function() { 
  	console.log(num) //可以訪問num
  }
}
var f = fn()
f() //10

閉包的主要作用: 延伸了變數的作用范圍

3.3 閉包案例

  1. 回圈注冊點擊事件
//html
<ul >
  <li>a</li>
  <li>b</li>
  <li>c</li>
  <li>d</li>
</ul>
//js
//點擊li輸出當前li的索引
//利用動態田徑屬性方式
var lis = document.querySelector('.nav').querySelectorAll('li')
for(var i=0 ;i<lis.length; i++) {
  lis.index = i
	lis[i].onclick = function() {
  	console.log(this.index)
  }
}
//利用閉包的方式
var lis = document.querySelector('.nav').querySelectorAll('li')
for(var i=0 ;i<lis.length; i++) {
  (function(i) {
  	lis[i].onclick = function() {
  	console.log(i)
  }
  })(i)
	
}
  1. 回圈中的setTimeout()
//html
<ul >
  <li>a</li>
  <li>b</li>
  <li>c</li>
  <li>d</li>
</ul>
//js
//利用閉包
var lis = document.querySelector('.nav').querySelectorAll('li')
for(var i=0 ;i<lis.length; i++) {
  (function(i){
  	setTimeout(function() {
    	console.log(lis[i].innerHTML)
    },3000)
  })(i)
}
  1. 計算打車價格
var car = (function() {
		var start = 13;
    var total = 0;
  return {
    //正常價格
  		price: function(n) {
      	if(n <= 3) {
        	total = start
        } else {
        	total = start + (n-3)* 5
        	}
        return total;
      }, 
    	// 擁堵之后
    	yd: function(flag) {
      	flag? total+ 10 :total
      } 
  	}
	})()
console.log(car.price(5))
console.log(car.yd(true))

3.4 閉包總結

  1. 閉包是什么?

閉包就是一個函式(一個作用域可以訪問另外一個函式的區域變數)

  1. 閉包的作用是什么?

延伸變數的作用范圍

4 遞回

4.1 什么是遞回

如果一個函式在內部可以呼叫其本身,那么這個函式就是遞回函式,
遞回函式的作用和回圈效果一樣
由于遞回很容易發生“堆疊溢位”(stack overflow),所以必須要加退出條件 return

4.2 利用遞回求數學題

  1. 求123...*n
function fn(n) {
  if(n = 1) {
  	return 1
  }
	return n * fn(n-1)
}
console.log(fn(3)) // 6

4.3 利用遞回求:根據id回傳對應的資料物件

var data = https://www.cnblogs.com/lfcss/p/[{
	id:1,
  name:'家電',
  goods: [
    {
      id: 11,
      gname: '冰箱'
    },
    {
    	id: 12,
      gname: '洗衣機'
    }
  ]
},
            {
            id: 2,
              name: '服飾'
            }
 ]
function getObj(arr, id) {
  var o = {}
	arr.forEach(function(item){
  	if(item.id === id) {
    	o= item
    } else if(item.goods && item.goods.length>0) {
    		o =getObj(item.goods, id);
    }
  })
  return o
}
console.log(getObj(data, 1))

5 遞回

5.1 淺拷貝和深拷貝

  1. 淺拷貝只是拷貝一層,更深層次物件級別的只拷貝參考,
  2. 深拷貝拷貝多層,每一級別的資料都會拷貝,
  3. Object.assign(target, ...sources) es6新增方法可以淺拷貝
var obj = {
	id: 1,
  name: 'andy',
  msg: {
   age: 18
  }
}
var o = {}
for(var k in obj) {
  // k是屬性名
	o[k] = obj[k]
}
console.log(o)
o.msg.age = 20
console.log(obj) //obj發生變化

//用es6語法糖
Object.assign(o, obj)

image.png

//深拷貝,應用遞回的方法
function deepCopy(newObj, oldObj) {
	for(var k in oldObj) {
  	//判斷我們的屬性值屬于哪種型別
    var item = oldObj[k]
    // 判斷是否是陣列
    if(item instanceof Array) {
    	newObj[k] = []
      deepCopy(newObj[k], item)
      
    } else if(item instanceof Object) {
      //判斷是否是物件
      newObj[k] = {}
      deepCopy(newObj[k], item)
    } else { // 屬于簡單資料型別
    	 newObj[k] = item
    }  
    
  }
}
deepCopy(o,obj)
console.log(o)

總結

本篇文章主要分享了函式的嚴格模式、高階函式、閉包、遞回、深拷貝、淺拷貝等知識點的用法及應用,如果想了解更多,請掃描二維碼
qrcode_for_gh_4d3763fa9780_258 (1).jpg

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/145762.html

標籤:JavaScript

上一篇:常見DOM操作筆記匯總!過于簡潔,小白勿入~

下一篇:windows手動安裝npm教程 即vue

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more