变量提升在下方会有代码演示
| let | var | const | |
|---|---|---|---|
| 变量提升/预解析 | ? | ? | ? | 
| 重复定义 | ? | ? | ? | 
| 作用域 | 块级作用域 | 函数作用域 | 块级作用域 | 
| 常量是否可变 | ? | ? | ? | 
| 对象/数组是否可变 | ? | ? | ? | 
| 需要初始化 | ? | ? | ? | 
例子:如同公交车,上来个人等2s保证安全在发车,如果等的期间还有人来,则重新等到安全
实现:
function debounce(func,wait){
	let timeout;
	return function(){
		if(timeout) clearTimeout(timeout)	//若存在,则清空定时器
		let callNow = !timeout;			
		timeout = setTimeout(()=>{	//增加定时器
			timeout=null;							//时间到了,清除定时器
		},wait)
		if(callNow) func.apply(this)
	}
}
例子:如同拿工资,你一次把工资取完,只有在公司打钱的那一天,卡里才能拿得到钱。你急着要钱,不好意思么有,你时间到了不去拿钱,之后去拿还能拿。
实现:
function throttle(func,wait){
	let timeout;
  return function(){
    if(!timeout){
    	timeout = setTimeout(()=>{	//增加定时器
    		timeout=null;							//时间到了,清除定时器
      	func.apply(this)
      },wait)
    }	
	}
}
//看一下下面输出什么
var length = 100
function f1(){
  console.log(this.length)
}
var obj = {
  x:10,
  f2: function (f1){
    f1();
    arguments[0]();
  }
}
obj.f2(f1,1)
//考点:预解析+作用域+arguments
懵了吧 我开始也是!!
(1) 先介绍arguments ->是函数内置参数
先!把下面代码放在浏览器运行一下
function a(){
  console.log(arguments)
}
a(1,2,3,4,‘s‘,‘d‘)
{"0": 1,"1": 2,"2": 3, "3": 4,"4": "s", "5": "d"}(2) 逐层分析调用者&作用域
function f1(){
  console.log(this.length)
}
var obj = {
  x:10,
  f2: function (f1){
    f1();						//无调用者 =》作用域window
    arguments[0]();	//无调用者 =》作用域arguments
  }
}
obj.f2(f1,1)				//调用者obj =》作用域obj
(3) 分析函数执行顺序
obj.f2(f1,1)	      这没跑了 就是调用obj的f2//函数一   f1()   //函数二  arguments[0]();
console.log(this.length) 此时无调用者因此作用域指向window,获取到的length也就是全局中的100因此最后答案是100 ,2 可放在浏览器上试试哦
原文:https://www.cnblogs.com/cc123nice/p/13121427.html