首选匿名函数内部或外部的变量
Prefer variables inside or outside anonymous function
假设我有一个匿名函数,它需要一些变量来跟踪它的状态。该函数对匿名函数内部或外部的变量的作用相同。在决定在哪里定义变量时是否有任何性能或其他考虑因素?
例如。有什么理由更喜欢这个
function fn () {
let i = 0
return something(cb => {
setInterval(() => cb(i++), 1000)
})
}
关于这个
function fn () {
return something(cb => {
let i = 0
setInterval(() => cb(i++), 1000)
})
}
如果匿名函数被多次调用,它们在功能上并不相同,但为了论证起见,我们假设它只会被调用一次。
唯一值得担心的区别是代码的可维护性。一般来说,variables should live in the smallest scope possible。这可以使代码更易于阅读。例如:
These aren't functionally identical if the anonymous function is called multiple times but for the sake of argument lets say it will only be called once.
如果没有你明确说明,代码的 reader 可能会认为至少有可能 fn
被调用不止一次(否则,外部范围变量有什么意义?)。
或者,想象一下函数中是否有更多代码:compare
function fn () {
// a moderate amount of code
return something(cb => {
// a moderate amount of code
let i = 0
setInterval(() => cb(i++), 1000)
})
}
至
function fn () {
let i = 0
// a moderate amount of code
return something(cb => {
// a moderate amount of code
setInterval(() => cb(i++), 1000)
})
}
第一个版本可能更可取,因为变量的声明非常接近它的使用位置,而第二个版本并非如此。
它们之间的另一个区别是,解释器在作用域链上越往上查找变量引用,处理所需的时间就越长,至少在某些情况下是这样。这在几乎所有情况下都是微不足道的,但它仍然是一个潜在的差异:比较 https://jsfiddle.net/pa2v9xuj/ to https://jsfiddle.net/wzo7bgve/
假设我有一个匿名函数,它需要一些变量来跟踪它的状态。该函数对匿名函数内部或外部的变量的作用相同。在决定在哪里定义变量时是否有任何性能或其他考虑因素?
例如。有什么理由更喜欢这个
function fn () {
let i = 0
return something(cb => {
setInterval(() => cb(i++), 1000)
})
}
关于这个
function fn () {
return something(cb => {
let i = 0
setInterval(() => cb(i++), 1000)
})
}
如果匿名函数被多次调用,它们在功能上并不相同,但为了论证起见,我们假设它只会被调用一次。
唯一值得担心的区别是代码的可维护性。一般来说,variables should live in the smallest scope possible。这可以使代码更易于阅读。例如:
These aren't functionally identical if the anonymous function is called multiple times but for the sake of argument lets say it will only be called once.
如果没有你明确说明,代码的 reader 可能会认为至少有可能 fn
被调用不止一次(否则,外部范围变量有什么意义?)。
或者,想象一下函数中是否有更多代码:compare
function fn () {
// a moderate amount of code
return something(cb => {
// a moderate amount of code
let i = 0
setInterval(() => cb(i++), 1000)
})
}
至
function fn () {
let i = 0
// a moderate amount of code
return something(cb => {
// a moderate amount of code
setInterval(() => cb(i++), 1000)
})
}
第一个版本可能更可取,因为变量的声明非常接近它的使用位置,而第二个版本并非如此。
它们之间的另一个区别是,解释器在作用域链上越往上查找变量引用,处理所需的时间就越长,至少在某些情况下是这样。这在几乎所有情况下都是微不足道的,但它仍然是一个潜在的差异:比较 https://jsfiddle.net/pa2v9xuj/ to https://jsfiddle.net/wzo7bgve/