this的练习题

211 阅读1分钟

1、

var num = 10;
var obj = {
    num: 20
};
obj.fn = (function (num) {
    this.num = num * 3;
    num++;
    return function (n) {
        this.num += n;
        num++;
        console.log(num);
    }
})(obj.num);
var fn = obj.fn;
fn(5);
obj.fn(10);
console.log(num, obj.num);


/////////////////////////////////////////////////////////////////////////

var num = 10; //window.num=10
var obj = {
    num: 20
}; //obj=0x000;
obj.fn = (function (num) {
    /!*
     * EC(AN) 「闭包」
     *   作用域链:<EC(AN),EC(G)>
     *   初始THIS:window
     *   形参赋值:num=20  //->21 22 23
     *   变量提升:--
     *!/
    this.num = num * 3; //window.num=num*3=60
    num++;
    return function (n) {
        /!*
         * EC(FN1) -> fn(5) 
         *   作用域链:<EC(FN1),EC(AN)>
         *   初始THIS:window
         *   形参赋值:n=5
         *   变量提升:--
         *!/
        /!*
         * EC(FN2) -> obj.fn(10) 
         *   作用域链:<EC(FN2),EC(AN)>
         *   初始THIS:obj
         *   形参赋值:n=10
         *   变量提升:--
         *!/
        this.num += n; //window.num=window.num+n=65   obj.num=obj.num+n=30
        num++;
        console.log(num); //=>22 23
    }; //obj.fn=0x001; [[scope]]:EC(AN)
})(obj.num);
var fn = obj.fn; //fn=0x001;
fn(5);
obj.fn(10);
console.log(num, obj.num); //=>65 30

注意obj.fn这个函数执行上下文并没有被释放下次 obj.fn(10)用的还是这个

2、

  let obj = {
    fn: (function () {
        return function () {
            console.log(this);
        }
    })()
};
obj.fn();
let fn = obj.fn;
fn();


/* 
// 函数中的THIS是谁,和函数在哪定义的以及在哪执行的都没有关系,按照总结的规律去分析执行主体即可
let obj = {
    fn: (function () {
        return function () {
            console.log(this);
        } //obj.fn=0x000;
    })()
};
obj.fn(); //=>obj
let fn = obj.fn; //fn=0x000;
fn(); //=>window 
*/

3、

var fullName = 'language';
var obj = {
    fullName: 'javascript',
    prop: {
        getFullName: function () {
            return this.fullName;
        }
    }
};
console.log(obj.prop.getFullName());
var test = obj.prop.getFullName;
console.log(test());


var fullName = 'language'; //window.fullName='language';
var obj = {
    fullName: 'javascript',
    prop: {
        getFullName: function () {
            return this.fullName;
        }
    }
};
console.log(obj.prop.getFullName());
//=>this:obj.prop  =>obj.prop.fullName  =>undefined
var test = obj.prop.getFullName;
console.log(test());
//=>this:window =>window.fullName =>'language' 

4、

var name = 'window';
var Tom = {
    name: "Tom",
    show: function () {
        console.log(this.name);
    },
    wait: function () {
        var fun = this.show;
        fun();
    }
};
Tom.wait();


/* var name = 'window'; //window.name='window'
var Tom = {
    name: "Tom",
    show: function () {
        // this->window
        console.log(this.name); //=>'window'
    },
    wait: function () {
        // this->Tom
        var fun = this.show;
        fun();
    }
};
Tom.wait(); */

5、

window.val = 1;
var json = {
    val: 10,
    dbl: function () {
        this.val *= 2;
    }
}
json.dbl();
var dbl = json.dbl;
dbl();
json.dbl.call(window);
alert(window.val + json.val);


/* window.val = 1;
var json = {
    val: 10,
    dbl: function () {
        this.val *= 2;
    }
}
json.dbl();
//->this:json  ->json.val=json.val*2  ->json.val=20
var dbl = json.dbl;
dbl();
//->this:window ->window.val=window.val*2 ->window.val=2
json.dbl.call(window);
//->this:window ->window.val=window.val*2 ->window.val=4
alert(window.val + json.val); //=>"24" */

6、

 (function () {
    var val = 1;
    var json = {
        val: 10,
        dbl: function () {
            val *= 2;
        }
    };
    json.dbl();
    alert(json.val + val);
})();



/* (function () {
    var val = 1; //->2
    var json = {
        val: 10,
        dbl: function () {
            // this->json
            val *= 2; //val=val*2  此处的val是变量  json.val是对象的属性
        }
    };
    json.dbl();
    alert(json.val + val); //=>"12"
})(); */