JS學習之this關鍵字

his關鍵字跟在哪定義沒關係,跟在哪執行也沒關,this的查找只遵循以下三點
1)自執行函數中的this永遠是window
2)給元素的事件綁定方法,當觸發事件執行對應方法的時候,方法中的this是當前元素
3)不管函數在哪裏面執行,我們就看函數名之前是否有“·”,有的話,前面是誰就是誰,沒有就是window

//    var obj={fn1:fn};
//    obj.fn1();//前面有.即爲.前的obj
//    函數在定義的時候 ,this指的是誰 是不知道的
//    變量屬於哪個作用域,由他在哪兒(作用域)定義有關係
//自運行的函數都是在window下運行的this就是window
var number = 2;
    var obj = {
        number: 4,
        fn1: (function () {
        //自執行時,先聲明瞭一個函數和一個number
            this.number *= 2;//執行時this.number是全局變量number,即window.number=4
            number = number * 2;//這個number爲undefined,是這個自執行函數作用域內的number
            var number = 3;//這個作用域內的number被從新定義爲數字3
            return function () {
            //返回給fn1
                this.number *= 2;//在沒執行之前,這個this無法確定
                number *= 3;//這個number即爲自執行函數內定義的number並不是全局變量
                alert(number)
                //彈出的number也是自執行函數內定義的number
            }
        })(),
        db2: function () {
            this.number *= 2
        }
    };
    var fn1 = obj.fn1;
    alert(number);//彈出的爲全局變量number 爲4
    fn1();//這裏面的this即爲window 彈出9
    obj.fn1();//這裏面的this即爲obj 彈出27
    alert(window.number);//彈出8
    alert(obj.number);//彈出8

對上面的代碼進行分析,運行之前,先預解釋了一個number和一個obj,
當執行當自執行函數那裏 時,obj中的fn1屬性,對應的屬性值是那個自執行函數的返回函數,由於,返回函數被佔用了,所以這個自執行這次,產生的作用域不會被釋放掉。
又由於自運行的函數只要沒有·都是在window下運行的this就是window,故其執行時分析如上註釋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章