下面这只是个例,请问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>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
也不分析那么多了,直接来看一下你这函数的执行步骤吧。
申明了一个变量data;
申明了一个函数createComparisonFunction;
变量data赋值了一个数组引用;
data数组调用自身的sort方法,并传入了一个立即执行函数
后面的分析就不想写了,看到这里不知道题主明白了没有
核心是产生了一个闭包。
更新一个跟闭包相关的文档,让题主更方便理解
https://developer.mozilla.org...
propertyName和object1,object2 并没有什么直接的联系,你这里只是前者昨晚属性名去读取后者的数据。不知道你的意思是不是说返回一个接收了参数的函数,这个新的函数还可以继续传参数。如果是的话,可以参考bind方法
希望你能静下心来认真分析一下你提的那段代码,先看createComparisonFunction这个方法,它返回的是一个匿名函数:
这个匿名函数接收两个参数,也就是你问的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,作为数组排序的标准。
不太清楚题主的意思...
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){
});
问题里面的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