window.color = 'red';
let o = {color:'blue'};
function sayColor(){
console. log (this. color)
};//定义在全局的函数sayColor()引用了this对象。this到底引用哪个对象必须等到函数被调用时才能确定。
sayColor() ; //red
//全局调用,this会指向window,所以this.color相当于window.color
o.sayColor= sayColor;
о. sayColor(); // 'blue'
//赋值后调用,this会指向o,所以this.color相当于o.color
变式:
var name = 'lili';
var obj = {
name: 'liming',
prop: {
name: 'ivan',
getname: function () {
return this.name;
}}};
console.log (obj. prop. getname ()); //ivan
var test = obj. prop. getname; //liming
console.log (test ());
//通过test调用,所以this指向全局
注意: 如果使用的是箭头函数,中的this会保留定义该函数的上下文,不会改变 总结: 考察的是this指向问题。bind\call\apply可以改变this指向; call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 fun.call(obj1,'a','b','c')。
apply 的所有参数都必须放在一个数组里面传进去 fun.call(obj1,['a','b','c'])。
bind 除了返回是函数以外,它 的参数和 call 一样。
当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等。