gpt4 book ai didi

javascript - 休息参数是否允许优化?

转载 作者:数据小太阳 更新时间:2023-10-29 05:21:25 24 4
gpt4 key购买 nike

The Managing arguments section in Bluebird's article on Optimization killers指出:

The arguments object must not be passed or leaked anywhere.

换句话说,不要做以下事情:

function leaky(){
return arguments;
}

但是这样做:

function not_leaky(){
var i = arguments.length,
args = [];
while(i--) args[i] = arguments[i];
return args;
}

随着Rest paramters的引入,传递rest参数数组还会导致优化问题吗?据我了解,问题是我们不能让实际的 arguments 对象松动。 arguments 的有限定义副本是可以的,但不是实际的 Object 本身。如果是这种情况,以下列方式使用时,其余参数是否被视为 arguments 的 OK 和可优化副本?

function maybe_optimizable(...args){
return args;
}

具体来说,我正在尝试根据 David Walsh's debounce function (which is based on Underscore.js') 编写一个 debounce 函数我认为将 arguments 分配给 debounce 函数顶部范围内的变量存在问题。为了纠正这个问题,我写了以下内容:

function debounce(func, wait, immediate) {
let timeout;
return function (...args) {
let context = this,
now = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(() => {
timeout = null;
if (!immediate) {
func.apply(context, args);
}
}, wait);
if (now) {
func.apply(context, args);
}
};
}

最佳答案

arguments 对象的挑战之一是它需要是参数值的实时集合,即使它们被重新分配 em>。看看即使是具有原始值的(参数)变量如何在没有任何显式赋值的情况下被更改,并且它发生在函数之外:

function modify(arr) {
arr[0] = 3;
}

(function (a) {
console.log('arguments is an ' + arguments.constructor.name);
console.log('a is ', a);
modify(arguments);
console.log('after calling modify, a is ', a);
})(0);

参见 this blog有关此类行为的更多信息。

可以想象,当这样一个对象四处游荡,永远不会失去这种神奇的能力时,代码优化将成为一场噩梦。

这当然不会发生在普通数组中,你用扩展语法得到的数组确实是一个普通数组:

(function (...args) {
console.log('args is an ' + args.constructor.name);
})(0);

您可以放心(没有双关语意),上面提到的关于 arguments 的代码优化问题不适用于 ...args

严格模式解决了所有问题

正如 Bergi 提到的。当使用其 arguments 变量的函数以严格模式 JavaScript 编写时,arguments实时语义不再存在:

function modify(arr) {
arr[0] = 3;
}

(function (a) {
"use strict"; // <-----
console.log('In strict mode');
console.log('arguments is still an ' + arguments.constructor.name);
console.log('a is ', a);
modify(arguments);
console.log('after calling modify, a is still ', a);
})(0);

mdn's article on strict mode 中所述:

strict mode code doesn't alias properties of arguments objects created within it. In normal code within a function whose first argument is arg, setting arg also sets arguments[0], and vice versa (unless no arguments were provided or arguments[0] is deleted). arguments objects for strict mode functions store the original arguments when the function was invoked. arguments[i] does not track the value of the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i].

关于javascript - 休息参数是否允许优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com