Javascript 函数声明和闭包
Javascript function declarations and closures
这是关于 Javascript 和 Node.js 的一般性问题。假设我有一个函数如下:
function outer(a,b){
function inner(){
console.log(a[b]);
}
inner();
}
外层函数会被多次使用,它有这样的参数,因为我不想使用全局变量。
每次调用外层函数都会声明内层函数吗?
如果每次都声明,有没有办法不使用全局变量让代码更高效?
函数 inner
将在您每次调用 outer
时声明
我想你可以写
function outer(a,b){
console.log(a[b]);
}
而且没有全局变量。
如果不使用静态(在 JS 情况下是全局)变量,函数每次都会被声明。这里的方法是制作一个封装功能的对象:
var AnObject = function(a,b) {
this.a = a;
this.b = b;
this.foo = function() {
return this.a[this.b];
};
};
function outer(a,b) {
var inner = new AnObject(a,b);
console.log(inner.foo());
}
我希望我理解了你的问题,代码太简单了,无法假设更多你想要的东西。
Will the inner function be declared every time I call the outer function?
是的。然而,这并不是真的那么低效,而且引擎优化得很好。
If it is declared everytime, is there a way to make the code more performant without using global variables?
不要让您的代码过于复杂。如果它像当前编写的那样工作并且可维护,请保持原样。 outer
可能会经常被调用很多次,但除非它是一条非常热门的路径,并且您确实通过基准测试将其确定为性能瓶颈,否则无需采取任何措施。过早的优化是万恶之源。
但是回到你的问题:是的,有一种方法可以避免在不使用全局变量的情况下重新创建函数。只需将 inner
需要的值作为参数传递给每个调用:
function inner(a,b){
console.log(a[b]);
}
function outer(a,b){
inner(a,b);
}
假设内部函数没有分配给闭包变量,这很好。
如果您想避免将 inner
放在全局范围内,只需使用 module pattern 来创建 outer
。
这是关于 Javascript 和 Node.js 的一般性问题。假设我有一个函数如下:
function outer(a,b){
function inner(){
console.log(a[b]);
}
inner();
}
外层函数会被多次使用,它有这样的参数,因为我不想使用全局变量。 每次调用外层函数都会声明内层函数吗? 如果每次都声明,有没有办法不使用全局变量让代码更高效?
函数 inner
将在您每次调用 outer
时声明
我想你可以写
function outer(a,b){
console.log(a[b]);
}
而且没有全局变量。
如果不使用静态(在 JS 情况下是全局)变量,函数每次都会被声明。这里的方法是制作一个封装功能的对象:
var AnObject = function(a,b) {
this.a = a;
this.b = b;
this.foo = function() {
return this.a[this.b];
};
};
function outer(a,b) {
var inner = new AnObject(a,b);
console.log(inner.foo());
}
我希望我理解了你的问题,代码太简单了,无法假设更多你想要的东西。
Will the inner function be declared every time I call the outer function?
是的。然而,这并不是真的那么低效,而且引擎优化得很好。
If it is declared everytime, is there a way to make the code more performant without using global variables?
不要让您的代码过于复杂。如果它像当前编写的那样工作并且可维护,请保持原样。 outer
可能会经常被调用很多次,但除非它是一条非常热门的路径,并且您确实通过基准测试将其确定为性能瓶颈,否则无需采取任何措施。过早的优化是万恶之源。
但是回到你的问题:是的,有一种方法可以避免在不使用全局变量的情况下重新创建函数。只需将 inner
需要的值作为参数传递给每个调用:
function inner(a,b){
console.log(a[b]);
}
function outer(a,b){
inner(a,b);
}
假设内部函数没有分配给闭包变量,这很好。
如果您想避免将 inner
放在全局范围内,只需使用 module pattern 来创建 outer
。