繁体   English   中英

理解crockford的函数,它返回一个带有变量值的函数

[英]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 .

现在为什么这个解决方案有效,我的呢? 我没有看到我的解决方案有太大的不同,我看到的任何事情都没有明显错误。 有人可以解释一下吗?

osend(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参数会影响最初传递给funckyo 所以当你写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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM