[英]understanding crockford's function that returns a function with a variable value
我只是看Douglas Crockford的视频,他做了以下练习:
编写一个函数,当传递一个变量时,返回一个函数,如果调用该函数,则返回该变量的值。
所以我写了以下功能:
function funcky(o) {
return function send(o){ // notice the o in send
return o;
}
}
var x = funcky(3);
console.log(x()); // i get undefined why ??
注意发送中的o
。 我已经编写了一段时间的JavaScript,但我仍然不明白为什么我得到未定义?
crockfords解决方案如下:
function funcky(o) {
return function send(){
return o;
}
}
var x = funcky(3);
console.log(x()); // get 3 now .
现在为什么这个解决方案有效,我的呢? 我没有看到我的解决方案有太大的不同,我看到的任何事情都没有明显错误。 有人可以解释一下吗?
该o
在send(o){
是你犯了一个错误。 它不是从原始父母的论据中“继承” o
。 将它置于该函数声明中是在该函数的新范围内创建一个新的o
。
调用时send
不会传递任何内容,并返回其第一个参数,因此返回undefined
。
你的代码,注释:
function funcky(o) {
return function send(o){ // DECLARES NEW VARIABLE, happens to have same name
return o; //returns the first argument passed to send
}
}
var x = funcky(3); //nothing is passed to the inner function send
console.log(x()); // undefined due to lack of arguments
实际发生的事情的一个更清晰的例子:
function funcky(o) {
return function send(someArgument){
return someArgument; //return o; here would find the correct o, the first arg of funcky
}
}
这与o
的范围有关。 当你写:
return function send(o){ // notice the o in send
return o;
}
o
的范围是函数send的本地范围。 但是,如果你写:
return function send(){
return o;
}
o的范围不是函数send的本地范围,而是funcky范围的本地范围。
所以,当你编写function send(o){/*...*/}
,真正发生的是o
成为一个参数,并且需要像这样调用: funcky()(10)
,但你想要什么能做的就是funcky(10)()
。
编辑:
有关JavaScript中变量范围的更多信息,请参阅有关SO的详细答案 。
function funcky(o) {
return function send(o){ // notice the o in send
return o;
}
}
你的内部函数的o
参数会影响最初传递给funcky
的o
。 所以当你写var x = funcky(3);
,x只是一个send
函数,它需要一个参数返回,在闭包中没有捕获任何东西。
(换句话说,x在你的情况下没有对原始o
- 3的引用,因为通过名称o它调用x本身被调用的参数)。
因为范围。
函数send会在其内部范围中覆盖var o。
function funcky(o) {
// o here is whatever you passed in funcky
return function send(o){
// now o here is whatever you pass in send
// since you didn't pass anything the result is undefined
return o;
}
}
检查另一个例子
function funcky(o) {
return function send(a){
console.log(a);
console.log(o); // this o is the parent o
return o;
}
}
var x = funcky(3);
console.log(x());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.