Table of Contents generated with DocToc (opens new window)
# call,apply,bind的使用
Function.prototype.apply() (opens new window)
apply()方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象 (opens new window))提供的参数。function.apply(thisArg, [...argsArray])1Function.prototype.bind() (opens new window)
bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被指定为bind()的第一个参数,而其余参数将作为新函数的参数,供调用时使用。Function.prototype.call()
call()方法使用一个指定的this值和单独给出的一个或多个参数来调用一个函数。function.call(thisArg, arg1,arg2...)1
注意:该方法的语法和作用与
apply()(opens new window) 方法类似,只有一个区别,就是call()方法接受的是一个参数列表,而apply()方法接受的是一个包含多个参数的数组。
总结:
let a = 20;
var o = {
a: 10,
fn1: function () {
console.log(this == o);
console.log(this.a);
},
b: {
a: 12,
fn: function () {
console.log(this == o);
console.log(this.a); //12
},
},
};
// var j = o.fn1.bind(o);
// j();
var j = o.fn1;
j.call(o);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
首先,要弄明白这三个函数存在的意义是什么?
答案是改变函数执行时的上下文,也就是改变函数运行时的this指向。
# 箭头函数
“箭头函数”的
this,总是指向定义时所在的对象,而不是运行时所在的对象。
箭头函数没有this,它的this取决于该函数外部非箭头函数的this值
var name = 'global'
const o = {
name: 'local',
getName: () => {
console.log(this.name)
},
getName2() {
console.log(this.name)
},
getName3: function () {
console.log(this.name)
}
}
o.getName() // global
o.getName2() // local
o.getName3() // local
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# this指向问题
# 函数this
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
const和 let不会在全局声明时(在最顶部的范围)创建window (opens new window) 对象的属性。
即在全局时,通过const 和 let的声明不会挂载到window上,也无法通过this获取
函数在调用call、apply时,第一个参数 用于函数内部 上下文this 。
文章中指出当this碰到return时,如果return的是一个对象,那么this就指向这个对象;如果函数返回值不是一个对象(包括undefined),那么this还是指向函数实例。其中null比较特殊,虽然时对象,但还是指向函数实例。
总结就是: 箭头函数的this指向定义时所在的对象,而普通函数的this由运行时所在对象决定,即谁调用就指向谁。
← 相等性判断与隐式转换 数据类型判断 →