明仕msyz555函数的前往值是函数时,这个前往值里面函数的参数和外层函数参数的联络?

下面这只是个例,讨教propertyName和object1,object2有什么联络?请推行到普通情况下

<script type="text/javascript">
        function createComparisonFunctionpropertyName {
            return functionobject1, 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.sortcreateComparisonFunction"name";
        alertdata[0].name;  //Nicholas
         
        data.sortcreateComparisonFunction"age";
        alertdata[0].name;  //Zachary        
 
    </script>

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

  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 = functiona{
    var name = this.name
    console.loga[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这个办法,它前往的是一个匿名函数:


`functionobject1, 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.sortcreateComparisonFunction”name”实际上因此name属性作为排序标准对data数组中断排序,data.sortcreateComparisonFunction”age”因此age属性作为排序标准对data数组中断排序,以是两次排序后果纷比方样。以是你问propertyName和object1,object2有什么联络,实际上没什么联络,propertyName是作为object1,object2的排序标准的属性,实际是便是取object1,object2的propertyName属性出来比较一下大小而已,然后前往0,1或-1给sort,作为数组排序的标准。

不太明晰题主的意思…
propertyName与object1,object2没有干系。

这是一个闭包,调用createComparisonFunctionpropertyName时前往了一个匿名函数。
这个函数中的propertyName便是指向调用createComparisonFunctionpropertyName时传入的propertyName

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

这个匿名函数在被调用时,会盘诘外部能否有定义propertyName变量。发明没有就归去盘诘函数定义时的作用域createComparisonFunction中。里有没有propertyNmae变量。查找到createComparisonFunction运转时传入了propertyNmae参数,由此获取到了值.

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

ifa>breturn 1;
ifa<breturn -1;
ifa==breturn 0;

};
题目里面的object1,object2 正是这里的a和b,由于待排序的是数组里面的东西,因此,object1,object2是data[0]和data[1],而data[0]和data[1]是东西,而排序只能按照一个属性来,因此,有了var value1 = object1[propertyName];这里value1 相称于终极的a.关于 data.sortcreateComparisonFunction”name”来说createComparisonFunction是闭包,因此propertyName可以被return functionobject1, object2{……}拜访到。

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

(看完/读完)这篇文章有何感想! 明仕msyz555的分享…

发表评论

姓名 *
电子邮件 *
站点