javascript - 函数的返回值是函数时,这个返回值里面函数的参数和外层函数参数的联系?
黄舟
黄舟 2017-04-10 17:57:13
[JavaScript讨论组]

下面这只是个例,请问propertyName和object1,object2有什么联系?请推广到一般情况下

<script type="text/javascript">
        function createComparisonFunction(propertyName) {
            return function(object1, object2){
                var value1 = object1[propertyName];
                var value2 = object2[propertyName];
  
                if (value1 < value2){
                    return -1;
                } else if (value1 > value2){
                    return 1;
                } else {
                    return 0;
                }
            };
        }
 
        var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}];
         
        data.sort(createComparisonFunction("name"));
        alert(data[0].name);  //Nicholas
         
        data.sort(createComparisonFunction("age"));
        alert(data[0].name);  //Zachary        
 
    </script>
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(6)
PHP中文网

也不分析那么多了,直接来看一下你这函数的执行步骤吧。

  1. 申明了一个变量data;

  2. 申明了一个函数createComparisonFunction;

  3. 变量data赋值了一个数组引用;

  4. data数组调用自身的sort方法,并传入了一个立即执行函数

    4.1 立即执行函数执行接收一个参数propertyName,并返回闭包中一个匿名函数
    4.2 sort开始快排,每次比较双方大小的时候调用闭包中的匿名函数,并传入两个左右两个参数
        4.2.1 匿名函数读取闭包中的propertyName变量并开始执行相关逻辑
        // ...
    
    

后面的分析就不想写了,看到这里不知道题主明白了没有
核心是产生了一个闭包。

更新一个跟闭包相关的文档,让题主更方便理解

闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。

https://developer.mozilla.org...

高洛峰

propertyName和object1,object2 并没有什么直接的联系,你这里只是前者昨晚属性名去读取后者的数据。不知道你的意思是不是说返回一个接收了参数的函数,这个新的函数还可以继续传参数。如果是的话,可以参考bind方法

var test = function(a){
    var name = this.name
    console.log(a[name])
}
var new_test = test.bind({name:"age"});
//bind 绑定了一个对象,获取name 
new_test({name: "Zachary", age: 28})  
//输出  28 
new_test = test.bind({name:"name"});
new_test({name: "Zachary", age: 28})  
//输出 Zachary
伊谢尔伦

希望你能静下心来认真分析一下你提的那段代码,先看createComparisonFunction这个方法,它返回的是一个匿名函数:


`function(object1, object2){
            var value1 = object1[propertyName];
            var value2 = object2[propertyName];

            if (value1 < value2){
                return -1;
            } else if (value1 > value2){
                return 1;
            } else {
                return 0;
            }
        }`

这个匿名函数接收两个参数,也就是你问的object1和object2,这个匿名函数实际上做的是比较object1和object2的一个指定的属性的大小,而这个指定的属性就是你问的propertyName。所以你贴的代码中对数组进行排序时,sort方法接收的参数是自定义排序函数, 而调用createComparisonFunction正好返回了这样的函数,data.sort(createComparisonFunction("name"))实际上是以name属性作为排序标准对data数组进行排序,data.sort(createComparisonFunction("age"))是以age属性作为排序标准对data数组进行排序,所以两次排序结果不一样。所以你问propertyName和object1,object2有什么联系,实际上没什么联系,propertyName是作为object1,object2的排序标准的属性,实际是就是取object1,object2的propertyName属性出来比较一下大小而已,然后返回0,1或-1给sort,作为数组排序的标准。

PHPz

不太清楚题主的意思...
propertyName与object1,object2没有关系。

这是一个闭包,调用createComparisonFunction(propertyName)时返回了一个匿名函数。
这个函数中的propertyName就是指向调用createComparisonFunction(propertyName)时传入的propertyName

这个匿名函数会在data.sort()方法中被调用,分别传入data中的两个object。

这个匿名函数在被调用时,会查询内部是否有定义propertyName变量。发现没有就回去查询函数定义时的作用域(createComparisonFunction中。)里有没有propertyNmae变量。查找到createComparisonFunction运行时传入了propertyNmae参数,由此获取到了值.

巴扎黑

主要是sort函数,他可以按照字母顺序排序,也可以按照自定义顺序排序,而这个自定义排序标准必须写在sort的参数里面:
arr.sort(function(a,b){

if(a>b)return 1;
if(a<b)return -1;
if(a==b)return 0;

});
问题里面的object1,object2 正是这里的a和b,由于待排序的是数组里面的对象,因此,object1,object2是data[0]和data[1],而data[0]和data[1]是对象,而排序只能按照一个属性来,因此,有了var value1 = object1[propertyName];这里value1 相当于最终的a.对于 data.sort(createComparisonFunction("name"))来说createComparisonFunction是闭包,因此propertyName可以被return function(object1, object2){……}访问到。

黄舟

propertyName和object1,object2有什么联系?看怎么说了,应该说propertyName变量在object1, object2所处函数的闭包链上,所以关注点在那个函数,不在object1, object2

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号