this的指向
函数的call,apply.bind区别
call():调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。
fun.call(thisArg, arg1, arg2, ...)
apply():调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
fun.apply(thisArg, [argsArray])
call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。
bind():(创建)返回一个新函数,并且是函数内部this为传入的第一个参数。
fun.bind(thisArg[, arg1[, arg2[, ...]]]);
bind是返回对应的函数,便于稍后调用。apply、call 则是立即调用。
实际中使用函数的this
1 | btn.addEventListener('click' ,function handler(){ |
在上面两例中,我们要弄清楚this
是什么,应该去看源码,或者看文档,千万不要瞎猜,想当然的认为this指向就是谁。
当一个函数被调用时,拥有它的object会作为this传入。在global下,就是window or global,其他时候就是相应的object。
出现在函数嵌套里时,函数里面嵌套的函数是属于哪个object的,this就是哪个object,如果没有就是window。
摒弃语法糖,func()转化为func.call(undefined,arg1,arg2)
func(p1, p2) 等价于
func.call(undefined, p1, p2)obj.child.method(p1, p2) 等价于
obj.child.method.call(obj.child, p1, p2)
箭头函数中
箭头函数只能用赋值式写法,不能用声明式写法
默认绑定外层this,不能用call方法修改里面的this。
举例:
1 | function X(){ |
new和构造函数
以游戏中,大批量创造小兵为例。
1 | var 小兵 = { |
当需要大批量成千上百制造小兵时,可以用一个for循环。
1 | var 小兵们 = [] |
但使用For循环时,每一个士兵中的奔跑代码,攻击代码等是一模一样,但是都会占用内存,这样就会使占用内存非常大。
引入原型链改进:
1 | var 小兵共有属性 = { |
再优化:
1 | //制造小兵 |
new的出现:
1 | //制造小兵 |
直接重写prototype是比较危险的做法,建议的用法是将共有属性添加进prototype。
1 | 小兵.prototype.兵种 = '无名小卒' |
new小结
1 | var object = new Object() |