在我打算写这篇文章之前我徘徊了两分钟(没错就是两分钟), 徘徊的原因是我觉得以我当前的对于
js儿子-call与apply
的掌握, 还不足以我能够很好的去解释给自己或者读者去听, 尤其是在看了一些书里面讲到了很多关于apply与call的妙用. 很神奇没有想到还能这么用. 但写了这篇文章的一个原因是我蛮久没有写了博客, 也该写了(尽力微笑…). 另一个原因是我想通过我的角度去说下我对于apply和call的看法. 其实在刚刚认识call或者apply的时候, 我在想这两个货是到底干嘛的, 在没有认识他们之前, 我也完成了某些功能的开发呀, 这两个货色的作用到底是什么, 我觉得我有必要去好好了解下.
我打开了熟悉的mdn
恩, 他好像挂了. 算了我用手机打开吧. 其中描述中这样的说道: 可以让call或者apply中的对象调用当前
对象所有的function. 你可以使用call()来实现继承: 写一个方法, 然后让另一个新的对象来继承它(而不是在新对象中再写一次这个方法).
难道是这样:
var foo = {
name: 'wangdaye',
showName: function () {
console.log(this.name);
}
}
var bar = {
name: 'liayi'
}
foo.showName.call(bar);
我觉得这个栗子(栗子是我抄的_-_), 想表达的其实和上面描述里面提到的, 其实是一回事, 我觉得是这样, bar
这个人想看下自己家的房产证名字写的是谁的, 但是没有梯子, 因为房产证放在需要梯子才能够到的地方, 所以他问了邻居foo, 嘿我用下你家梯子(showNmae方法), 行用吧, 然后就看到了自己的房产证是"老婆的名字". 大概的的意思是, bar这个家伙没有自己方法, 但是他又想用, 怎么办那就借用了foo的方法. 就是这样.
同: apply
与call
方法的第一个参数是在运行指定的this
值. 需要注意的是, 指定的this
值并不一定是该函数执行时真正的this
值, 如果这个函数的处于非严格模式下, 则指定为null
与undefined
的this
值会自动指向全局对象(浏览器中就是window
对象), 同时值为原始值(数字, 字符串, 布尔值)的this
会指向该原始值的自动包装对象.
关于这句话, 我再举个栗子:
var max = Math.max.apply(null,array)
我在稍微说下: 这个栗子就很好的解释了上面提到的如果apply
或者call
的第一个参数, 我传递了null
或者undefined
那么这个时候this
的指的就是上面提到的window
, 而window
里面有Math.max
.
再举个栗子:
异: call
参数是这样的形式(this, num1, num2, …)
apply
参数是这样的形式(this, [])
-----------------------------------------更新-----------------------------------------------------------
我觉得既然聊到了apply
与call
就多聊一些, 加上this
与bind
。要说明this到底指向谁, 我在掘金上看到一篇关于this指向的文章, 提到了this永远指向最后调用它的那个对象
。
var name = 'wangda';
function aa () {
var name = "wanger";
console.log(name); // wangda
}
aa();