【JavaScript】经典练习题02(this指向)

486 阅读1分钟
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 等等。