子程序
一個或者多個語句組成的完成特定任務的相對獨立的的一段代碼塊;
包括:
- 函數: 有返回值
- 方法: 在對象中
- 過程: 沒有返回值
數學中函數
定義域中每一項元素總會對應一個或者多個值域中的值。
-函數式編程
編程風格符合數學函數;
閉包與let
常見的問題
for(var i =0;i<6;i++){
setTimeout(() => {
console.log(i)
})
}
解析:var 定義的變量是全局的沒有局部的定義域,所以輸出的i都是同一個i,i= 6時跳出循環,因此屬輸出6
上面的代碼將會輸出6個6,如何輸出0-5,可修改爲下面:
for(let i =0;i<6;i++){
setTimeout(() => {
console.log(i)
})
}
// or
for ( var i = 0; i< 6; i ++){
!function(){
setTimeout(() => {
console.log(i)
})
}()
}
// 使用let 或者立即執行函數可以輸出 0.1.2.3.4.5
解析:let 定義的變量只在{}內才能訪問到,形成了類似以閉包的效果;每次的i都在當前作用於內,不會被其他干擾;
this 的確定
函數與閉包、this
解析:
fn () => fn.call(undefined) // 此時this指向window,window.length === 當前tab窗口數量 ;因此輸出3
arguments[0]() => arguments[0].call(arguments) => fn.call(arguments) // 此時this指向arguments ;arguments.length === 2;因此輸出2
tip:
window.length === 默認爲當前窗口的窗口數量
第二個是參數的長度
最後關於this
this是call的第一個參數
new 重新設計了this
箭頭函數不接受this