(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