变量提升在下方会有代码演示
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