function each(arr,fn){
for(var i = 0; i < arr.length; i++){
fn( );
}
}
var max= arr[0];
each(arr,function( ){
if(max < arr[i]){
max = arr[i];
}
});
console.log(max);
上面的出的结果会是 函数中的i没有定义
原因:作用域问题
i 是在function函数里面执行的,
但是function函数里却没有定义i,在函数中找不到i的定义
就找该函数的父级作用域,该元素的父级作用域就是全局作用域,
但是在全局作用域中却没有定义i,所以就是undefined
function each(arr,fn){
for(var i = 0; i < arr.length; i++){
fn(i);//2.实参
}
}
var max= arr[0];
each(arr,function(index){//1.先设置形参,获取数组中得索引值
if(max < arr[index]){
max = arr[index];
}
});
console.log(max);
在上面的代码中 若想在函数function中得到数组的索引,那么我们就在函数中给一个参数,来代表数组的索引,而相应的each函数中的fn函数里也应该传入一个实参,即是数组的索引值 i 这样就可以顺利的遍历 并且得到想要的结果
var arr = [66,6,88,66];
//在求数组中的值所对应的参数中 也是如上,可是若是数组中出现两个相同的值时,所对应的索引的却会出现只有最后一个元素的索引,要改变这样的情况就只有如下写
<script>
var arr = [1,2,6,8,6];function each(arr,fn){
for(var i = 0 ; i < arr.length; i++){
var inde = fn(i);//接收函数的返回值
console.log(inde);//输出函数的返回值 结果undefined undefined 2 undefined 4
}
}
//找数组中对应的值
var index = -1;
each(arr,function(i){
if(arr[i] == 6){//注意:不要只写一个等号,那是赋值符号
index = i;
return index;//这是返回一个函数的值,但是却没有接收
}
});
// console.log(index);若是在这里输出得出的结果只有4
在上面的代码之中 最难理解的就是返回值,当然,这并不是最终的结果
优化后的最终的结果是
<script>
var arr = [26,22,66,88,66];
function each(arr,fn){
for(var i = 0; i < arr.length; i++){
var index = fn(i);//2.实参
if(index == false){
break;
}
}
}
var index = -1;
each(arr,function(i){
if(arr[i] === 66){
index = i;
return false; //当数组中的值等于66的时候,就停止遍历
}
});
console.log(index);
</script>