子程序
一个或者多个语句组成的完成特定任务的相对独立的的一段代码块;
包括:
- 函数: 有返回值
- 方法: 在对象中
- 过程: 没有返回值
数学中函数
定义域中每一项元素总会对应一个或者多个值域中的值。
-函数式编程
编程风格符合数学函数;
闭包与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