Javascript闭包覆盖函数表达式
Javascript closure overwrite function expression
我试图弄清楚闭包是如何工作的,这是我的示例
function func1(func) {
return function(summand) {
return func() + summand;
}
}
var func2 = function() {
return 3;
}
var func3 = func1(func2);
var value = func3(4);
alert(value);
var func2 = function() {
return 100;
}
var newValue = func3(100);
alert(newValue);
首先让我们分解一下代码。我写了一个函数,它需要一个函数作为参数,它将返回一个函数。
function func1(func) {
return function(summand) {
return func() + summand;
}
}
然后我以的形式定义了参数函数func2
var func2 = function() {
return 3;
}
然后调用func1并将func2作为pamerater。结果我得到了一个功能返回
var func3 = func1(func2);
然后我执行函数并传递4作为参数参数
var value = func3(4);
结果我得了7分。然后我覆盖func2并返回100
var func2 = function() {
return 100;
}
然后再次调用func3并作为参数值100传递。
var newValue = func3(100);
结果我得了103分。我定义的第一个函数(返回一个函数并将函数作为参数)仍将使用func2的第一个版本。这就是封闭的力量,我知道。
但看看下面的代码,当我将func2定义为函数声明而不是表达式时,那么func2将覆盖
function func1(func) {
return function(summand) {
return func() + summand;
}
}
function func2() {
return 3;
}
var func3 = func1(func2);
var value = func3(4);
alert(value);
function func2() {
return 100;
}
var newValue = func3(100);
alert(newValue);
第一个值为104,第二个值为200。
我的问题是,为什么当我使用函数声明时,它会覆盖旧函数,在这个例子中是func2。但当我使用函数表达式时,它将保留对旧func2的引用。
那是因为功能提升吗?
这不是因为闭包。
正如您所发现的,这个问题是因为功能提升。
您可以将函数声明视为"上移"到当前作用域的开头。
var f2 = function(){
return 50;
}
function f2(){
return 100;
}
在这种情况下,f2是50,因为它的解析方式类似于:
var f2 = function(){
return 100;
}
var f2 = function(){
return 50;
}
因为吊装。
它是因为吊装。使用function
语句而不是function
表达式会导致函数func2
被提升到作用域的顶部。在执行作用域中的任何代码之前,您将覆盖func2
。
因为提升你的代码实际上看起来是这样的:
function func1(func) {
return function(summand) {
return func() + summand;
}
}
function func2() {
return 3;
}
// Hoisted!!! Overwriting the previous func2 definition.
function func2() {
return 100;
}
var func3 = func1(func2);
var value = func3(4);
alert(value);
var newValue = func3(100);
alert(newValue);
在func1
内部,func
是对它所传递的函数的稳定引用。。。这只是你在认为自己通过return 100;
版本之前就已经通过了。
使用function foo() { ... }
样式时,定义的是一个名为foo
的函数。当您使用var foo = function() { ... }
样式时,您声明了一个变量foo
(将被提升),并将匿名函数指定为其值。
写是可以的
var a;
a = 2;
// ...stuff...
a = 3;
并且我们期望该值为3。就在这里,吊装使其像:
var func2;
func2 = function() { .. some stuff.. };
// ...stuff...
func2 = function() { .. some other stuff .. };
相比之下,我认为如果你定义函数,它只会在初始解析中使用一个或另一个函数定义。
- 调用正则表达式匹配的函数
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 参数更改时,角度表达式中的函数不更新
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 能够在定义函数表达式之前使用它
- 函数表达式,返回回调函数
- JavaScript中的立即调用函数表达式(IIFE)-传递jQuery
- 函数声明与函数表达式之间的性能差异
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- 立即调用函数表达式(IIFE)相对于普通函数的优势
- 如何通过jsp表达式标记将java字符串变量传递给javascript函数
- 用正则表达式在js中进行函数修剪
- 错误-应为赋值或函数调用,但实际看到的却是表达式
- Javascript错误正则表达式不是函数
- “期望赋值或函数调用,而是看到了表达式.” - 不必要的控制台.log
- 为过滤器创建javascript正则表达式函数
- 如何修复这个正则表达式函数
- 传递变量来替换正则表达式函数
- 正则表达式函数4个字母和4个数字