关于javascript的闭包

function returnfunc (propertyName) {
  return function (obj) {//-----这行定义并返回了一个闭包,也被称之为一个匿名函数
    return obj[propertyName];       
  };
}

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

这段代码看了很久了,但是完全一头雾水。为什么最后输出了Picasso
为什么可以把{name:"Picasso"}作为savefunc的参数呢,savefunc不是应该等于obj[propertyName]吗?
求大牛解答,js好复杂啊。

__

感谢大家的回答,非常感谢。不过只能采纳一个,抱歉了。

阅读 3.4k
7 个回答

理解这个并不需要知道闭包,并且我建议你在js还不太熟悉的情况下,更不用去知道什么是闭包,这样只会增加学习成本
<------分割线------>
1.returnfunc 这个函数接返回值也是一个函数,所以在执行var savefunc = returnfunc("name");之后。现在的

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

2.savefunc现在是一个函数,他又接收了一个参数{name:"Picasso"},这个参数是一个对象,他不但可以是这种格式的对象,也可以是一段函数(因为函数也是对象),我这样说,你可能更晕。。。简单说,函数传参的形式不限于字符串)。
于是就变成了

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

此时返回{name:"Picasso"}["name"]。 name作为对象的key,找到了,此对象的值Picasso。

一步一步解析代码

    function returnfunc (propertyName) {
          return function (obj) { 
            return obj[propertyName];       
          };
    }
    // 此时的savefunc为functin(obj){ return obj[propertyName]; }
    var savefunc = returnfunc("name");   
    // 现在就开始执行function(name) {return obj[name] } 为什么是name呢 
    // 因为闭包的关系 propertyName就是returnfunc函数中的参数“name”
    // 所以函数体里执行的是 return {name:"Picasso"}[name]
    var result = savefunc({name:"Picasso"});
    //返回字符串“Picasso”
    console.log(result);   

savefuncreturnfunc函数执行返回的函数,就是下面的代码

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

这个返回的函数中的propertyName 就是执行returnfunc函数传入的参数。

savefunc执行的时候传入的参数就是obj。所以返回的值是 Picasso

var savefunc = returnfunc("name");

这段代码你传了个参数,实际上在你整段程序这个参数就是某个对象的属性

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

紧接着这段代码,你就传了个对象进去,对象!你程序最后不就是要的传进来的对象的某个属性么?哪里有不明白的

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

相当于这么调用,注意两个圆括号

首先纠正你的理解 -- (savefunc不是应该等于obj[propertyName])


var savefunc = returnfunc("name");
执行这句话之后savefunc返回的是一个函数 ,
savefunc = function(obj){

return obj[propertyName];

}
propertyName = "name";


savefunc是一个函数, 所以才有了接下来这句
var result = savefunc({name:"Picasso"});
此时给savefunc传入了一个对象{name:"Picasso"},相当于
obj = {

name:"Picasso"

}


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

总结:savefunc 返回了一个函数 result返回一个对象里的值

新手上路,请多包涵

我个人理解:当你执行var savefunc = returnfunc("name");时,它的返回值是一个函数,而这个返回函数实际上脱离了returnfunc函数暴露在全局作用域中。当你往savefunc()传入一个参数(这个参数是一个对象{name:"Picasso"})时,自然也就可以执行,从而得到Picasso了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题