function foo() {
let sum = 0;
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
// 因为 sum += arguments[i] 转化为了字符串
console.log(typeof sum);
return sum;
}
let nums = [];
for(let i = 0; i < 100000; i++) {
nums.push(i);
}
console.log(foo.call(null, nums));
console.log(foo.apply(null, nums));
/*
在一些JavaScript引擎中,我会从第二个log函数中得到正确的答案:499950000,但是在另外的一些引擎(如Safari 6)中
则会产生“RangeError:Maximum call stack exceeded”错误
下面是一些已知的限制:
1、字符串常量中允许的最大字符数
2、可以作为阐述传递到函数中数据的大小,单位为字节
3、函数声明中参数的个数
4、未经优化的调用栈的最大层数,如多次的递归调用,即函数调用链的最大长度
5、JavaScript程序以阻塞方式在浏览器中的最长运行时间
6、变量名的最大长度
需要注意一下
*/
/*
其次,call和apply的区别,call和apply接收的第一个参数没有区别都是需要处理对象
之后的参数,call接收的是一个个按顺序排列的参数列表
apply接受的是一个参数数组
在这个demo中,foo的第一个调用,对应的arguments.length为1,返回的sum的值为00,1,2,3,....字符串
foo的第二个调用,对应的arguments.length为100000,返回的sum的值为499950000(正确值)
*/
实现中的限制
最新推荐文章于 2019-11-13 22:07:29 发布