下面是MDN上关于this指针的表述:
当前执行上下文(global、function 或 eval)的一个属性,在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。—MDN
从字面上的意思,this也就是当前对象主体的一个代指。
结果:
在JavaScript中有三个函数可以对bind, call, apply进行动态的改变: 区别:
执行形式上:call和apply在使用后会立刻执行函数,而bind则只是绑定this对象,在之后才会调用
传入参数上:call, bind, apply第一个传入参数是一致的,都是第一个参数为this要指向的对象,区别在于,call和bind后面的参数都是后续传参,而apply的第二个参数则必须是一个数组
箭头函数调用call或者apply方法的时候第一个参数会被忽略!(不能绑定this) // 通过bind call apply可以改变this指针的指向 // call和apply在使用后会立刻执行函数,而bind则只是绑定this对象,在之后才会调用 // 1.call:第一个参数是要改变的this指向 后续参数都是其要传入的值 function print() { console.log(this); console.log(this.name); console.log(arguments); } var name = "ax" let obj = { name: 'AX' } print(19, '计算机类'); // window // ax // Arguments(2) [19, "计算机类", callee: ƒ, Symbol(Symbol.iterator): ƒ] print.call(obj, 20, '软件工程'); // {name:'AX'} // AX // Arguments(2) [20, "软件工程", callee: ƒ, Symbol(Symbol.iterator): ƒ] // 2.apply print.apply(obj, [21, "前端实习工程师"]); // {name: "AX"} // AX // Arguments(2) [21, "前端工程师", callee: ƒ, Symbol(Symbol.iterator): ƒ] // 3.bind // bind仅绑定,而不会立即执行,如果需要立刻执行 则必须在后面加上立即执行 // bind会返回一个函数,这个函数就是新的绑定了this的函数 console.log(print.bind(obj, 22, "前端工程师")); //ƒ print() // 执行bind后的函数 print.bind(obj, 22, "前端工程师")(); //{name: "AX"} // AX // Arguments(2) [22, "前端工程师", callee: ƒ, Symbol(Symbol.iterator): ƒ] // 必须注意的是,原函数不会被bind影响,打印结果同正常情况下直接调用print,也就是说 // 函数执行bind的结果只会绑定在返回的函数上面 print(); // window // ax // Arguments(2) [19, "计算机类", callee: ƒ, Symbol(Symbol.iterator): ƒ]