在javascript函数中使用未使用的参数会降低执行速度吗?它占用了记忆吗?我经常使用从未实际使用的参数编写函数,例如,函数将事件作为参数,但事件从不用于任何事情。
答案 0 :(得分:4)
减慢执行速度?
运行时间取决于对输入执行的操作。可以是搜索,排序或任何简单的操作。操作的运行时间决定了它的执行速度。因此,当您不传递任何参数时,这意味着不对该参数执行任何操作,因此运行时间稳定。
是否会占用内存?
但就内存分配而言,它们通常被分配Lexical Environment。
当函数运行时,在每个函数调用上,新的 创建
LexicalEnvironment
并使用参数填充, 变量和嵌套函数声明。
所以对于以下功能:
function sayHi(name) {
/* LexicalEnvironment = { name: passedvalue,
phrase: undefined }*/ // created at this point.
var phrase = "Hi, " + name
alert(phrase)
}
因此,当您将其作为sayHi()
调用时,词汇envirmonemt看起来像:
LexicalEnvironment = { name: undefined, phrase: undefined};
因此,当解释器解释函数时,每个参数和函数变量都被分配内存。
当解释器准备启动功能代码执行时, 在第一行运行之前,会创建一个空的 LexicalEnvironment 和填充参数,局部变量和嵌套函数。
答案 1 :(得分:1)
JavaScript无论如何都会存储发送到arguments
数组中每个函数的参数,无论您为它们分配局部变量。
function test() {
console.log(arguments)
}
test('these','are','passed')
//logs ["these','are',passed']
我的观点是,未使用的参数无论如何都会占用内存,你只是使用另一个变量名来引用它们。
答案 2 :(得分:0)
在javascript函数中使用未使用的参数会降低执行速度吗?
可能不适用于现代引擎(它消除了琐碎的死代码)。无论如何,在堆栈上分配变量便宜。
是否会占用内存?
至少有几个字节用于将函数体保存为字符串。
我经常使用从未实际使用的参数编写函数,例如函数将事件作为参数,但事件从不用于任何事情。
如果没有基准测试,您不应该关心微优化。并且不要试图超越编译器,V8和SpiderMonkey在优化代码方面做得很好。
答案 3 :(得分:0)
我对这个问题的一个子集很感兴趣:生成未使用参数的代码是否被评估?我的用例是用于调试日志消息:当我将日志级别设置为小于“debug”时,是否会在调试代码中放慢我的脚本?我在https://jsperf.com/log-parameters/1运行基准测试以找出答案。这表明代码已经过评估,并确实减慢了脚本的速度。
Benchmark.prototype.setup = function() {
var generate_message = function() {
// Do some calculations to generate a dummy message.
var s = ''
for (var i = 1; i < 512; i++) {
var a = Math.random()
var b = Math.random()
s += String.fromCharCode(48 + Math.floor(128*a*b))
}
return s
}
var Log = {
level: 1, /* 1 = FATAL, 4 = DEBUG */
fatal: function(msg) {this.log(1, msg)},
debug: function(msg) {this.log(4, msg)},
log: function(lvl, msg) {
if (lvl <= this.level) {
if (typeof msg === 'function') msg = msg()
console.log([new Date(), lvl, msg].join('::'))
}
},
}
};
Log.debug(generate_message())
Log.debug(generate_message)
36,047±1.45%ops / sec
30,326,171±5.55%ops / sec