你不知道的js疑问整理

145 阅读1分钟

上卷

p86

function foo() { 
    console.log( this.a );
}
function doFoo(fn) {
    // fn 其实引用的是 
    foo fn(); // <-- 调用位置!
}
var obj = { 
    a: 2,
    foo: foo
};
var a = "oops, global"; // a 是全局对象的属性 
doFoo( obj.foo );

foo函数的调用位置为全局??

p92

function foo(something) { 
    this.a = something;
}
var obj1 = { 
    foo: foo
};
var obj2 = {};
    obj1.foo( 2 );
    console.log( obj1.a ); // 2
    obj1.foo.call( obj2, 3 );
    console.log( obj2.a ); // 3
var bar = new obj1.foo( 4 ); //见下方
console.log( obj1.a ); // 2 
console.log( bar.a ); // 4

探究下这个new过程是怎么执行的:

1、新创建一个空对象

2、对象的指针指向obj1的foo函数

3、执行foo函数内的代码,创建新对象的属性a=4

4、返回新创建的对象,赋值给bar

p99

function foo() {
    // 返回一个箭头函数 
    return (a) => {
        //this 继承自 foo()
        console.log( this.a );
    };
}
var obj1 = { 
    a:2
};
var obj2 = { 
    a:3
};
var bar = foo.call( obj1 );
bar.call( obj2 ); // 2, 不是 3 !

注意点: 箭头函数的this指向定义时的this,而非运行时;