鍍金池/ 問(wèn)答/HTML/ 關(guān)于javascript的閉包

關(guān)于javascript的閉包

function returnfunc (propertyName) {
  return function (obj) {//-----這行定義并返回了一個(gè)閉包,也被稱之為一個(gè)匿名函數(shù)
    return obj[propertyName];       
  };
}

var savefunc = returnfunc("name");     //調(diào)用returnfunc()
var result = savefunc({name:"Picasso"});//調(diào)用savefunc()
alert(result);                        //返回字符串“Picasso”

這段代碼看了很久了,但是完全一頭霧水。為什么最后輸出了Picasso
為什么可以把{name:"Picasso"}作為savefunc的參數(shù)呢,savefunc不是應(yīng)該等于obj[propertyName]嗎?
求大牛解答,js好復(fù)雜啊。

__

感謝大家的回答,非常感謝。不過(guò)只能采納一個(gè),抱歉了。

回答
編輯回答
呆萌傻

savefuncreturnfunc函數(shù)執(zhí)行返回的函數(shù),就是下面的代碼

function (obj) {
    return obj[propertyName];       
  };

這個(gè)返回的函數(shù)中的propertyName 就是執(zhí)行returnfunc函數(shù)傳入的參數(shù)。

當(dāng)savefunc執(zhí)行的時(shí)候傳入的參數(shù)就是obj。所以返回的值是 Picasso

2018年4月27日 19:26
編輯回答
忘了我

理解這個(gè)并不需要知道閉包,并且我建議你在js還不太熟悉的情況下,更不用去知道什么是閉包,這樣只會(huì)增加學(xué)習(xí)成本
<------分割線------>
1.returnfunc 這個(gè)函數(shù)接返回值也是一個(gè)函數(shù),所以在執(zhí)行var savefunc = returnfunc("name");之后?,F(xiàn)在的

savefunc = function(obj){
   return obj["name"];
}

2.savefunc現(xiàn)在是一個(gè)函數(shù),他又接收了一個(gè)參數(shù){name:"Picasso"},這個(gè)參數(shù)是一個(gè)對(duì)象,他不但可以是這種格式的對(duì)象,也可以是一段函數(shù)(因?yàn)楹瘮?shù)也是對(duì)象),我這樣說(shuō),你可能更暈。。。簡(jiǎn)單說(shuō),函數(shù)傳參的形式不限于字符串)。
于是就變成了

 result = function({name:"Picasso"}){
       return {name:"Picasso"}["name"];
    }

此時(shí)返回{name:"Picasso"}["name"]。 name作為對(duì)象的key,找到了,此對(duì)象的值Picasso。

2018年9月15日 23:18
編輯回答
情未了

一步一步解析代碼

    function returnfunc (propertyName) {
          return function (obj) { 
            return obj[propertyName];       
          };
    }
    // 此時(shí)的savefunc為functin(obj){ return obj[propertyName]; }
    var savefunc = returnfunc("name");   
    // 現(xiàn)在就開(kāi)始執(zhí)行function(name) {return obj[name] } 為什么是name呢 
    // 因?yàn)殚]包的關(guān)系 propertyName就是returnfunc函數(shù)中的參數(shù)“name”
    // 所以函數(shù)體里執(zhí)行的是 return {name:"Picasso"}[name]
    var result = savefunc({name:"Picasso"});
    //返回字符串“Picasso”
    console.log(result);   
2017年10月8日 13:28
編輯回答
貓小柒

我個(gè)人理解:當(dāng)你執(zhí)行var savefunc = returnfunc("name");時(shí),它的返回值是一個(gè)函數(shù),而這個(gè)返回函數(shù)實(shí)際上脫離了returnfunc函數(shù)暴露在全局作用域中。當(dāng)你往savefunc()傳入一個(gè)參數(shù)(這個(gè)參數(shù)是一個(gè)對(duì)象{name:"Picasso"})時(shí),自然也就可以執(zhí)行,從而得到Picasso了。

2017年2月25日 00:12
編輯回答
朕略傻

首先糾正你的理解 -- (savefunc不是應(yīng)該等于obj[propertyName])


var savefunc = returnfunc("name");
執(zhí)行這句話之后savefunc返回的是一個(gè)函數(shù) ,
savefunc = function(obj){

return obj[propertyName];

}
propertyName = "name";


savefunc是一個(gè)函數(shù), 所以才有了接下來(lái)這句
var result = savefunc({name:"Picasso"});
此時(shí)給savefunc傳入了一個(gè)對(duì)象{name:"Picasso"},相當(dāng)于
obj = {

name:"Picasso"

}


理清思路, result返回的才是obj[propertyName],
由上邊第一步可以得知返回的就是 obj[name] 的值,即 Picasso

總結(jié):savefunc 返回了一個(gè)函數(shù) result返回一個(gè)對(duì)象里的值

2018年1月4日 13:41
編輯回答
糖豆豆
var result = returnfunc("name")({name:"Picasso"});
alert(result);

相當(dāng)于這么調(diào)用,注意兩個(gè)圓括號(hào)

2017年7月23日 20:10
編輯回答
冷溫柔
var savefunc = returnfunc("name");

這段代碼你傳了個(gè)參數(shù),實(shí)際上在你整段程序這個(gè)參數(shù)就是某個(gè)對(duì)象的屬性

var result = savefunc({name:"Picasso"});

緊接著這段代碼,你就傳了個(gè)對(duì)象進(jìn)去,對(duì)象!你程序最后不就是要的傳進(jìn)來(lái)的對(duì)象的某個(gè)屬性么?哪里有不明白的

2018年8月26日 01:41