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