首先大家可能听的最多的是this的指向问题,this的指向问题大概可以这样概括,对象的this指向本身,匿名函数this指向的是windon或者是包裹的上级,事件的this指向是dom。不懂同学可以点击this指向;
好了不多说进入正题,apply,call,以及bind(new 更改的this指向默认的是apply),这三个都可以改变this的指向,哪它们的 区别什么?
call、apply、bind方法的共同点和区别:
*apply的一些扩展
1.数组最大最小值
求数组中的最大最小值,js有相应的方法:Math.min(),Math.max(),但是这两个方法有个不方便的地方就是其参数不能是数组,而是单个元素值,即(para1,para2,para3....)。所以使用就没有那么方便了,但是我们可以使用这个方法,并且运行速度比传统快:
1
2
|
var
min = Math.min.apply(
null
, arr);
var
max = Math.max.apply(
null
, arr);
|
2.数组合并。数组的合并也和求最值一样,我们可以使用简单的push(para1);进行循环push.但我们也可以使用比较简单的方法:
1
|
Array.prototype.push.apply(arrA, arrB);
//将数组arrB push到数组 arrA中。
|
这里要解释下能这么用的原因。从另外一个关于apply的文章,我们可以了解到,function的apply方法的第二个参数是一个数组集合, 在调用的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) ,所以利用变个特性,我们就实现了上面的功能。
下面是我的完整代码,方便大家学习了解。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$(
'#getMinMax'
).click(
function
() {
var
arr = [1, 2, 3, 4, 5, 6, 7, 0.9, 11];
var
min = Math.min.apply(
null
, arr);
var
max = Math.max.apply(
null
, arr);
alert(
'min:'
min
' max:'
max);
});
$(
'#unite'
).click(
function
() {
var
arrA = [
'1'
,
'2'
,
'3'
];
var
arrB = [4, 5, 6];
Array.prototype.push.apply(arrA, arrB);
var
str =
'newArr:['
;
for
(
var
i = 0; i < arrA.length; i ) {
str = arrA[i]
','
;
}
str = str.substr(0, str.length - 1)
']'
;
alert(str);
});
|