javascript之函數進階詳解
函數定義方式
function fn(){}//命名函數 var fun=function(){}//匿名函數 // new fn=new Funcion("參數1","參數2","函數體"),很少用。 //所有函數都是Function的實例對象(函數也是對象) var fn=new Funcion("a","b","console.log(a+b)") console.log(fn instanceof Object)//true
函數的調用(6種)
this指向問題
1.普通函數:window
2.對象方法:實例對象obj1
3.構造函數:實例對象。原型對象裡面的this指向的也是 ldh這個實例對象
4.綁定事件函數:事件的調用者button1
5.定時器:window
6.立即執行函數:window
改變函數內部this指向:call(),apply(),bind(),
如果有的函數我們不需要立即調用,但是又想改變這個函數內部的this指向此時用bind
嚴格模式
為整個腳本開啟或為函數開啟:“use strict”;
嚴格模型的語法規范:
1.變量使用前必須聲明
2.我們不能隨意刪除已經聲明好的變量
3.嚴格模型下的全局作用域中函數中的this是undefined
4.構造函數不加new調用,this指向undefined,給undefined賦值會報錯(。以前指向window,相當於給window添加屬性瞭)
5.定時器this還是指向window 。事件、對象還是指向調用者。
6.參數不能重名
7.函數必須聲明在頂層.新版本的JavaScript 會引入“塊級作用域”(ES6 中已引入)。為瞭與新版本接軌,不允許在非函數的代碼塊內聲明函數。
高階函數
定義:高階函數是對其他函數進行操作的函數,它接收函數作為參數(回調函數)或將函數作為返回值輸出。
閉包
閉包( closure )指有權訪問另一個函數作用域中變量的函數。簡單理解就是,一個作用域可以訪問另外一個函數內部的局部變量。
閉包的作用:延伸變量的作用范圍
閉包練習:
已知:綁定事件、定時器都是異步操作,不會立即執行。
(function(i){…})(i) 立即執行函數會立即執行,參數傳給尾部的小括號,function裡面的小括號會再次接收這個參數。立即執行函數也稱作小閉包,裡面的所有函數都可以訪問它內部變量。
(1)點擊輸出當前索引號(面試常見)
(2)延遲三秒輸出<li>中內容
(3)
閉包的思考:
遞歸:函數裡面調用自己,需要有結束條件
深拷貝與淺拷貝:
1.淺拷貝:隻拷貝最上面一層,深層的對象隻拷貝瞭地址,所以原深層數據改變會引起拷貝過來的深層數據改變
Object.assign(objNew,objOld)
2.深拷貝:把所有深層數據值全部拷貝到新對象裡面。新舊兩個對象的數據修改互不影響。
推薦閱讀:
- 一文搞懂JavaScript中的this綁定規則
- JavaScript中的this例題實戰總結詳析
- Vue自定義指令中無法獲取this的問題及解決
- JS中call(),apply(),bind()函數的區別與用法詳解
- JavaScript函數this指向問題詳解