JavaScript: 给一个函数和函数表达式同名可以吗?
JavaScript: Is it okay to give a function the same name as the function expression?
在 JavaScript 中,如果我创建如下函数表达式:
var foo = function foo() {
return 'Hello world!';
}
这样可以吗?会不会出现什么问题?或者我应该这样做:
var foo = function baz() {
return 'Hello world!';
}
这取决于你想要什么。内部名称是函数的局部名称;外部名称在外部范围内,并被闭包捕获。因此,如果您以不同的方式命名函数,则可以从内部重新分配外部引用:
var foo = function baz() {
return foo;
};
var quux = foo;
foo = 17;
quux(); // => 17
当您将函数命名为不同相同时,这是不可能的,因为外部变量将无法访问,被内部变量覆盖。如果您想要 这种情况,那么您需要以不同的方式命名它们。但是,我不会说以任何一种方式命名函数都存在任何问题。
编辑:除非您需要支持寿命终止的浏览器。然后小心龙
主要区别在于,在您的第一个示例中,当在函数内部时,foo
是一个影子变量,并不引用全局 foo
。例如:
var foo = function foo() {
foo = 1;
}
foo();
console.log(typeof(foo));
输出'function'
因为我们只是在函数内部重新定义了foo。
但是,如果您以第二种方式定义函数,foo
指的是全局对象:
var foo = function baz() {
foo = 1;
}
foo();
console.log(typeof(foo));
这将输出 'number'
因为我们已经修改了全局对象。
在 JavaScript 中,如果我创建如下函数表达式:
var foo = function foo() {
return 'Hello world!';
}
这样可以吗?会不会出现什么问题?或者我应该这样做:
var foo = function baz() {
return 'Hello world!';
}
这取决于你想要什么。内部名称是函数的局部名称;外部名称在外部范围内,并被闭包捕获。因此,如果您以不同的方式命名函数,则可以从内部重新分配外部引用:
var foo = function baz() {
return foo;
};
var quux = foo;
foo = 17;
quux(); // => 17
当您将函数命名为不同相同时,这是不可能的,因为外部变量将无法访问,被内部变量覆盖。如果您想要 这种情况,那么您需要以不同的方式命名它们。但是,我不会说以任何一种方式命名函数都存在任何问题。
编辑:除非您需要支持寿命终止的浏览器。然后小心龙
主要区别在于,在您的第一个示例中,当在函数内部时,foo
是一个影子变量,并不引用全局 foo
。例如:
var foo = function foo() {
foo = 1;
}
foo();
console.log(typeof(foo));
输出'function'
因为我们只是在函数内部重新定义了foo。
但是,如果您以第二种方式定义函数,foo
指的是全局对象:
var foo = function baz() {
foo = 1;
}
foo();
console.log(typeof(foo));
这将输出 'number'
因为我们已经修改了全局对象。