1. 程式人生 > 實用技巧 >JS中一道關於this和閉包的題

JS中一道關於this和閉包的題

this和閉包的一道練習題

var num = 20;
var obj = {
    num: 30,
    fn: (function (num){
        this.num *= 3;
        num += 15;
        var num = 45;
        return function(){
            this.num *= 4;
            num += 20;
            console.log(num);
        }
    })(num)
};

var fn = obj.fn();
fn();
obj.fn();
console.log(window.num, obj.num);

-> 65
-> 85
-> 240, 120

obj.fn()執行
執行this.num * = 3 將全域性下的num改為 60
執行 num+=15,將私有作用域下的num改為45,因為num是形參VAR不影響私有變數num
執行 num = 45,私有變數num 為45
因為私有作用域下的F2函式被外部引用,所以棧記憶體不銷燬

執行fn()
執行this.num * = 4,將全域性下的num更改為240
執行 num + = 20,將上級作用於下的私有變數num改為65
執行console.log(num) => 65

執行obj.fn()
執行this.num * = 4,將obj例項中的num改為120
執行num + = 20, 將上級作用於下的私有變數num改為85
執行console.log(num) => 85

執行console.log(window.num, obj.num) => 240, 120