(1) /*通过this传递了对象的引用*/ function identify() { console.log(this); //this指向不是window 而是call改变指向的对象 return this.name.toUpperCase(); } function speak() { var greeting ='hello i am'+identify.call(this); return greeting; } var you={ name:'zhangsan' }; let me={ name:'hxq' }; // console.log(identify.call(me)); // console.log(identify.call(me)); //HXQ // console.log(identify.call(you)); //ZHANGSAN console.log(speak.call(me)) //HXQ
(2)) !(function () { /*误解:this指向函数本身*/ function fn(n) { console.log(n); this.count++;//NAN } fn.count=0; var i; for (i=0;i<10;i++){ if(i>5){ fn(i); } } console.log(fn.count);//o })()
/*隐式绑定*/ function foo() { console.log(this.a); } var obj={ foo:foo, a:2 } obj.foo() //2 var fn=obj.foo; //undefined
function foo() { console.log(this.a); //42 } var obj2 = { a: 42, foo: foo } var obj1 = { a: 2, obj2: obj2 } obj1.obj2.foo()
//硬绑定 强行把foo中的this绑定在对象上 function foo() { console.log(this.a); } var obj = { a: 2 }; var bar=function () { foo.call(obj); } bar(); //2 setTimeout(bar,1000);//2 bar.call(this);//2 bar.call(window);//2
function foo(sm) { console.log(this.a,sm); return this.a + sm } var obj={ a:2 } var bar=function () { return foo.apply(obj,arguments); //用apply改变this指向并且传参(参数为一个对象) } var b=bar(3); //2,3 console.log(b);//5