正文开始
一说到call,
————总是call
、‘张三’、‘李四’的区别什么什么的,说的很清楚,转身还是傻傻分不清楚他们的区别了,相似的事情总是喜欢一起来说,这对于新手来说总是容易混乱的,今天就来理解下call的用法;
通俗点:
call
的作用就是: 改变函数执行时的上下文 也就是this
的指向;
用法:
Food.call(thisArg, arg1, arg2, ...)
来看个例子 — A
1 | function fun(){ |
直接运行这个函数 wrap.myfun();
执行这个函数后
1、在wrap下面执行myfun()
后,其中的this指向window全局的
2、在window全局下面创建了一个 age
属性,值为 'fun-age'
3、wrap中的age
还是default
来看个例子 — B
1 | function fun(){ |
例子B运行时:
wrap.obj()执行后,在执行fun
时,把this, call进去了, 这个this是指向wrap
,所以fun
执行时其中的this指向的是wrap
,自然改变的就是wrap
中的age,这就是call
的作用改变了fun
执行时的上下文;
好累,反正我是大概懂了他(this)刚才干了什么;
那么在我们的coding中,一般什么时候用到call了?
call的用法
利用call来 做继承
1 | var Person = function () { |
如果不在student函数中执行 call,new出来的实例是没有fun属性方法的;打call就可以实现继承Person方法了;
判断数据的类型
【object、 array、 null】1
2
3
4
5
6
7
8
9
10var obj1 = {name: 'longlee'}
var obj2 = ['longlee']
var obj3 = null
Object.prototype.toString.call(obj1) // "[object Object]"
Object.prototype.toString.call(obj2) // "[object Array]"
Object.prototype.toString.call(obj3) // "[object Null]"
Object.prototype.toString.call(12) // "[object Number]"
....
....
类(伪)数组使用数组方法
1 | var arg = Array.prototype.slice.call(arguments); |
获取数组中的最大值和最小值
1 | maxInNumbers = Math.max.call(Math, 55, 888 , 521 , -36); // 888 |
就说到这了,再说下去,我自己也快消化不良了、、、、
题外话:
说到数组的最大值、最小值。我控制不住自己了,一个ES6的简洁方法Math.max(...[2,1,3])
// 3Math.min(...[2,1,3])
// 1
个人见解,有误之处,大神请指出,以免改正!
弄懂 call 了。可以继续打 call 了