簡體   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