javascript闭包示例中看似未赋值的变量和函数的值
在我试图理解javascript中闭包的一个非常具体的方面时,我觉得有必要用一个例子来说明它。这来自: 这并不能解决我个人的困惑,尽管我的困惑也与y的价值有关 我的问题是,当add5(2)返回函数(y)时,当y没有在makeAdder(x)内部或外部显式赋值时,它如何确定y的值?另外,add5(2)=makeAdder(5)(2)吗?如果是这样,当本例中没有定义makeAdder(x)(y)时,该函数如何执行?另外,有没有一种方法可以帮助那些很难将闭包背后的逻辑内在化的人澄清这个问题?看起来好像add5(2)将2分配给y,但我没有明确的方法来跟踪这一点。非常感谢您的帮助。谢谢大家! 变量“y”是调用“makeAdder”返回的函数的参数。它的值没有在“makeAdder”中设置,因为这没有意义;关键是创建一个新函数,将给定的值(“x”)添加到参数(“y”)中 返回的函数接受一个参数“y”。在调用“makeAdder”后,当code调用返回的函数并传入“y”的值时,将执行最后的加法(javascript闭包示例中看似未赋值的变量和函数的值,javascript,closures,Javascript,Closures,在我试图理解javascript中闭包的一个非常具体的方面时,我觉得有必要用一个例子来说明它。这来自: 这并不能解决我个人的困惑,尽管我的困惑也与y的价值有关 我的问题是,当add5(2)返回函数(y)时,当y没有在makeAdder(x)内部或外部显式赋值时,它如何确定y的值?另外,add5(2)=makeAdder(5)(2)吗?如果是这样,当本例中没有定义makeAdder(x)(y)时,该函数如何执行?另外,有没有一种方法可以帮助那些很难将闭包背后的逻辑内在化的人澄清这个问题?看起来好像
5+2
或其他)
函数调用语法(括号内的参数列表)从左到右求值,因此
makeAdder(5)(2)
与
(makeAdder(5))(2)
意思是
使用参数5调用“makeAdder”函数,然后在返回时将其返回值视为函数引用,并使用参数2调用该函数
变量“y”是调用“makeAdder”返回的函数的参数。它的值没有在“makeAdder”中设置,因为这没有意义;关键是创建一个新函数,将给定的值(“x”)添加到参数(“y”)中
返回的函数接受一个参数“y”。在调用“makeAdder”后,当code调用返回的函数并传入“y”的值时,将执行最后的加法(5+2
或其他)
函数调用语法(括号内的参数列表)从左到右求值,因此
makeAdder(5)(2)
与
(makeAdder(5))(2)
意思是
使用参数5调用“makeAdder”函数,然后在返回时将其返回值视为函数引用,并使用参数2调用该函数
看待这个问题的一个方法是
var add5 = makeAdder(5);
var add10 = makeAdder(10);
本质上相当于
var add5 = function(y) {
return 5 + y;
}
var add10 = function(y) {
return 10 + y;
}
也许这会有所帮助?一种看待这一点的方法是
var add5 = makeAdder(5);
var add10 = makeAdder(10);
本质上相当于
var add5 = function(y) {
return 5 + y;
}
var add10 = function(y) {
return 10 + y;
}
也许这有帮助
我的问题是,当add5(2)返回函数(y)
时,当y未在makeAdder(x)内或外的任何位置显式赋值时,它如何确定y的值
makeAdder返回的函数是:
其中x已被赋值为5
这就是你的y。它在函数表达式中作为形式参数的包含实际上与用var声明它相同,x在makeAdder中以相同的方式初始化
另外,add5(2)=makeAdder(5)(2)吗
是的,不过我想你是指=
(等于),而不是=
(赋值)
如果是这样,当本例中没有定义makeAdder(x)(y)时,该函数如何执行
makeAdder返回一个函数,因此第二组括号将使用提供的任何值(包括none)调用该函数:
同:
var foo = makeAdder(5);
var bar = foo(2);
唯一的区别是,在第二种情况下,中间结果在被调用之前存储为foo
另外,有没有一种方法可以帮助那些很难将闭包背后的逻辑内在化的人澄清这个问题
闭包的真正威力在于,一个函数可以返回另一个函数,该函数在创建时仍具有相同的作用域链,因此它可以独占访问其作用域链上所有执行上下文的局部变量(除了全局变量,它们不是独占的)在这些函数完成执行之后。可以使用闭包创建复杂的继承结构(但不推荐)
正是这种持久性使得闭包真正有用,而不仅仅是范围链解析
我的问题是,当add5(2)返回函数(y)
时,当y未在makeAdder(x)内或外的任何位置显式赋值时,它如何确定y的值
makeAdder返回的函数是:
其中x已被赋值为5
这就是你的y。它在函数表达式中作为形式参数的包含实际上与用var声明它相同,x在makeAdder中以相同的方式初始化
另外,add5(2)=makeAdder(5)(2)吗
是的,不过我想你是指=
(等于),而不是=
(赋值)
如果是这样,当本例中没有定义makeAdder(x)(y)时,该函数如何执行
makeAdder返回一个函数,因此第二组括号将使用提供的任何值(包括none)调用该函数:
同:
var foo = makeAdder(5);
var bar = foo(2);
唯一的区别是,在第二种情况下,中间结果在被调用之前存储为foo
另外,有没有一种方法可以帮助那些很难将闭包背后的逻辑内在化的人澄清这个问题
闭包的真正威力在于,一个函数可以返回另一个函数,该函数在创建时仍具有相同的作用域链,因此它可以独占访问其作用域链上所有执行上下文的局部变量(除了全局变量,它们不是独占的)在这些函数完成执行之后。复合天然气