在JavaScript中this 的值是在代码运行时计算出来的,它取决于代码上下文
    函数内部的 “this” 是“点符号前面”的那个对象
    如果 obj.f() 被调用了,则 thisf 函数调用期间是 obj

    在没有对象的情况下调用:严格模式下this == undefined
    在非严格模式的情况下,this 将会是 全局对象(浏览器中的 window)

    箭头函数有些特别:它们没有 this。在箭头函数内部访问到的 this 都是从外部获取的

    例1

    1. var a = {
    2. name: "里面的name",
    3. sayName: function(){
    4. console.log("this.name = " + this.name);
    5. }
    6. };
    7. var name = "外面的name";
    8. function sayName(){
    9. var sss = a.sayName;
    10. sss(); // this.name = ?
    11. a.sayName(); // this.name = ?
    12. (a.sayName)(); // this.name = ?
    13. (b = a.sayName)(); // this.name = ?
    14. }
    15. sayName();

    解析
    sayName.call(null): this -> window
    sss.call(null): this -> window, this.name === “外面的name”
    a.sayName.call(a): this -> a, this.name = “里面的name”
    (a.sayName).call(a): this -> a, this.name = “里面的name”
    (b = a.sayName)() 等价于b.call(null): this -> window, this.name === “外面的name”

    例2

    1. var length = 10
    2. function fn(){
    3. console.log(this.length)
    4. }
    5. var obj = {
    6. length: 5,
    7. method: function(fn) {
    8. fn();
    9. arguments[0]();
    10. }
    11. }
    12. obj.method(fn, 1) // 输出是什么?

    解析
    obj.method.call(obj, fn, 1)
    arguments = [fn, 1]
    fn.call(null): this -> window , this.length === 10
    arguments0等价于arguments.fn.call(arguments), this.length === 2