function cat(age,color){ console.log(this) console.log(color) } const age1 = 1 const age2 =2 const color1 = 'white' const color2 = 'black' //1.函数直接调用: cat(age1,color1) /*node输出: this----> 根据运行环境而定,指向当前运行的环境,浏览器中指向window color----> white */ //2.this隐式调用 const new_cat1 = { name:'白猪', cat } //new_cat1.cat(age1,color1) /*node输出: this----> { name: '白猪', cat: [Function: cat] } this指向当前调用cat函数的对象:new_cat1 color----> white */ //3.this显示调用 call与apply cat.call({name:'白猪'},age1,color1) /*node输出: this----> { name: '白猪'} this指向call()的第一个参数 color----> white */ cat.apply({name:'白猪'},[age1,color1]) /*node输出: this----> { name: '白猪'} this指向apply()的第一个参数 color----> white */ //call与apply的结果是一样的,区别在于调用方法的参数的传递形式不一样. // call是按照参数顺序依次传入,call(this对象,arg1,arg2...) // apply是把参数放入一个数组里,apply(this对象,[arg1,arg2...]) //4.bind强制绑定this const new_cat2 = cat.bind({name:'黑猪'}) //bind只绑定this,不执行cat函数 new_cat2(age2,color2) //new_cat2执行 /*node输出: this----> {name:'黑猪'} this指向bind()里的参数对象 color----> black */ const my_cat = { name:'白猪', new_cat2 } my_cat.new_cat2(age1,color1) /*node输出: this----> {name:'黑猪'} color----> white this依然指向new_cat2所bind()里的参数对象,它没有指向my_cat证明bind绑定的this优先级更高 */ new_cat2.call({name:'白猪'},[age1,color1]) /*node输出: this----> {name:'黑猪'} color----> white this依然指向new_cat2所bind()里的参数对象,它没有指向由call绑定的{name:'白猪'}证明bind绑定的this优先级比call高 */ cat(2,'black') /*node输出: this----> 根据运行环境而定,指向当前运行的环境,浏览器中指向window color----> black 单纯执行cat函数时,this依然指向运行环境,说明前面的this绑定并不会影响函数本身 */