javascript
JavaScript高级之函数进阶
1. 函數的定義和調用
1.1 函數的定義方式
1.2 函數的調用方式
2. this
2.1 函數內 this 的指向
這些 this 的指向,是當我們調用函數的時候確定的。 調用方式的不同決定了this 的指向不同
一般指向我們的調用者.
JavaScript 為我們專門提供了一些函數方法來幫我們更優雅的處理函數內部 this 的指向問題,常用的有 bind()、call()、apply() 三種方法。
call() 方法調用一個對象。簡單理解為調用函數的方式,但是它可以改變函數的 this 指向。
2. apply 方法
apply() 方法調用一個函數。簡單理解為調用函數的方式,但是它可以改變函數的 this 指向。
3. bind 方法
bind() 方法不會調用函數。但是能改變函數內部this 指向
2.2 call apply bind 總結
相同點:
都可以改變函數內部的this指向.
區別點:
主要應用場景:
3. 嚴格模式
3.1 什么是嚴格模式
JavaScript 除了提供正常模式外,還提供了嚴格模式(strict mode)。ES5 的嚴格模式是采用具有限制性 JavaScript 變體的一種方式,即在嚴格的條件下運行 JS 代碼。
嚴格模式在 IE10 以上版本的瀏覽器中才會被支持,舊版本瀏覽器中會被忽略。
嚴格模式對正常的 JavaScript 語義做了一些更改:
消除了 Javascript 語法的一些不合理、不嚴謹之處,減少了一些怪異行為。
消除代碼運行的一些不安全之處,保證代碼運行的安全。
提高編譯器效率,增加運行速度。
禁用了在 ECMAScript 的未來版本中可能會定義的一些語法,為未來新版本的 Javascript 做好鋪墊。比如一些保留字如:class, enum, export, extends, import, super 不能做變量名
3.2 開啟嚴格模式
嚴格模式可以應用到整個腳本或個別函數中。因此在使用時,我們可以將嚴格模式分為為腳本開啟嚴格模式和為函數開啟嚴格模式兩種情況。
為腳本開啟嚴格模式
為整個腳本文件開啟嚴格模式,需要在所有語句之前放一個特定語句“use strict”;(或‘use strict’;)。
有的 script 基本是嚴格模式,有的 script 腳本是正常模式,這樣不利于文件合并,所以可以將整個腳本文件放在一個立即執行的匿名函數之中。這樣獨立創建一個作用域而不影響其他 script 腳本文件。
為函數開啟嚴格模式
要給某個函數開啟嚴格模式,需要把“use strict”; (或 ‘use strict’; ) 聲明放在函數體所有語句之前。
3.3 嚴格模式中的變化
嚴格模式對 Javascript 的語法和行為,都做了一些改變。
1. 變量規定
2. 嚴格模式下 this 指向問題
以前在全局作用域函數中的 this 指向 window 對象。
嚴格模式下全局作用域中函數中的 this 是 undefined。
以前構造函數時不加 new也可以 調用,當普通函數,this 指向全局對象
嚴格模式下,如果 構造函數不加new調用, this 指向的是undefined 如果給他賦值則 會報錯
new 實例化的構造函數指向創建的對象實例。
定時器 this 還是指向 window 。
事件、對象還是指向調用者。
3. 函數變化
函數不能有重名的參數。
函數必須聲明在頂層.新版本的 JavaScript 會引入“塊級作用域”( ES6 中已引入)。為了與新版本接軌,不允許在非函數的代碼塊內聲明函數。
更多嚴格模式要求參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
4. 高階函數
高階函數是對其他函數進行操作的函數,它接收函數作為參數或將函數作為返回值輸出。
此時fn 就是一個高階函數
函數也是一種數據類型,同樣可以作為參數,傳遞給另外一個參數使用。 最典型的就是作為回調函數。
同理函數也可以作為返回值傳遞回來
5. 閉包
5.1 變量作用域
變量根據作用域的不同分為兩種:全局變量和局部變量。
5.2 什么是閉包
閉包(closure)指有權訪問另一個函數作用域中變量的函數。 ----- JavaScript 高級程序設計
簡單理解就是 ,一個作用域可以訪問另外一個函數內部的局部變量。
5.3 在 chrome 中調試閉包
5.4 閉包的作用
5.5 閉包案例
2. 循環中的 setTimeout()。
5.6 閉包總結
閉包是一個函數 (一個作用域可以訪問另外一個函數的局部變量)
延伸變量的作用范圍
6. 遞歸
6.1 什么是遞歸?
如果一個函數在內部可以調用其本身,那么這個函數就是遞歸函數。
簡單理解:函數內部自己調用自己, 這個函數就是遞歸函數
遞歸函數的作用和循環效果一樣
由于遞歸很容易發生“棧溢出”錯誤(stack overflow),所以必須要加退出條件 return。
6.2 利用遞歸求數學題
求 1 * 2 *3 … * n 階乘。
求斐波那契數列 。
根據id返回對應的數據對象
6.3 利用遞歸求:根據id返回對應的數據對象
6.4 淺拷貝和深拷貝
淺拷貝只是拷貝一層, 更深層次對象級別的只拷貝引用.
深拷貝拷貝多層, 每一級別的數據都會拷貝.
Object.assign(target, …sources) es6 新增方法可以淺拷貝
淺拷貝中:修改拷貝之后的對象 o, 也會影響到obj對象,因為淺拷貝只是拷貝一層, 更深層次對象級別的只拷貝引用
總結
以上是生活随笔為你收集整理的JavaScript高级之函数进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四、数据预处理——处理连续型特征:二值化
- 下一篇: JS高级——JSON、数据存储学习笔记