call和apply的功能类似, 区别仅仅是传入的参数形式不同。
它们的作用都是使用指定的this值来调用某个函数,用来改变上下文环境。
举例说明:
call把this的指向改成指向foo, 但bar函数依旧执行了。
Step1
调用call的时候, 想当于把foo对象进行了一次改造:
等于把bar函数设为了foo对象的一个属性——>执行bar函数——>删除这个属性
按照这个思路,可以写出一个call2模拟函数:
|
|
但是这个模拟没有实现传参功能,所以需要进行改造。
Step2
关于传参, 举个栗子:
call的传参是不定的, 用arguments来获取所有的参数。
改造如下:
Step3
基本已经完成了模拟, 有几个小问题需要注意:
1.this参数可以传null, 此时this指向window
1234567var value = 1;function bar() {console.log(this.value);}bar.call(null); // 相当于window.value 输出12.函数可以有返回值
所以有如下call函数完全体:
实现apply
实现了call以后实现apply就非常简单了, 只是参数形式不同。
|
|