今天在学习函数柯理化的时候发现了一个问题,具体代码如下:
function createCurry(func, args) {
//length 是函数的参数长度
var argity = func.length;
var args = args || []; //为啥这里用let定义会显示 args重复 呢
//返回的是这个函数,此时还未执行此函数,只是建立好了闭包
return function () {
//arguments是类数组的形式
var _args = [].slice.apply(arguments); //转换为数组并取值
args.push(..._args);
if (args.length < argity) { //不大于参数长度就继续调用
return createCurry.call(this, func, args);
}
return func.apply(this, args);
}
}
在这段代码中,var args = args || []; 这一行如果换成let args = args || [] ; 就会显示变量重复定义。
一开始我思考的方向是变量作用域和函数参数的特点。
最后查看了ES6标准的let 和var 的区别,let是块级变量声明关键字,它不支持重复定义。而var是支持重复定义的。
例子:
看var例子:这里在window全局环境下,var 明显可以重复定义,且能够引用之前的值。
看let例子:显示变量重复定义,说明,在当前块下,let无法声明已经存在的变量名。
在函数中
在函数中形参占用了变量名,因此使用var覆盖变量可行,但是使用let就会报变量重复定义的错误。
总结
这个问题其实非常简单,在思考的过程中把问题复杂化了。在这里提醒自己一下,希望以后解决bug能够找到问题关键所在。