1. 程式人生 > >js基礎知識:閉包,事件處理,原型

js基礎知識:閉包,事件處理,原型

bsp ret asc 原函數 ati tac ons 標識符 構造

閉包:其實就是js代碼在執行的時候會創建變量對象的一個作用域鏈,標識符解析的時候會沿著作用域鏈一級一級的網上搜索,最後到達全局變量停止。所以某個函數可以訪問外層的局部變量和全局變量,但是訪問不了裏層的變量

with和catch語句都會在作用域的前端添加一個變量對象

        function buildUrl(){
            var qs = "?debug=true"

            with(location){
                var url = href + qs ;
            }

            return url
        }

如果一個函數對象要訪問內層函數中的變量的話,就用return就行了

事件處理:事件先捕獲然後再冒泡,從document開始在document結束,addEventListener中第三個參數為true時,在捕獲階段處理事件,為false是在冒泡階段處理事件,默認為false

ie有自己的attachEvent方法,與addEventListener不同的是,事件名中多了‘on’,而且沒有第三個參數,只支持冒泡

原型:

        function Person(name) {
             this.name = name;
        }
        var
person1 = new Person(‘Mick‘);

每一個創建的函數都有原型屬性,它是一個指針,指向函數的原型對象。

每個函數的實例都有一個構造函數的指針,指向原函數對象

 console.log(person1.constructor == Person); //true

原型對象其實也相當於一個實例,所以他的構造函數也指向原函數對象

console.log(person1.constructor==Person.prototype.constructor)//true

每個對象都有 __proto__ 屬性,但只有函數對象才有 prototype 屬性

繼承就是讓sub的原型指向另一個函數對象(super的實例),從而而這個原型對象的constructor屬性指向的是函數對象super

原型對象本來就是可以讓實例對象共享其中的方法,所以,這個時候sub就可以訪問到super實例和super的原型對象中的方法了

        function Super() {
             this.sayHi = ()=>{
                 alert(‘hi‘)
             }
        }
        function Sub(){
            this.say = ()=>{
                alert(‘im sub‘)
            }
        }
        Sub.prototype = new Super()
        var sub1 = new Sub() ;
        console.log(sub1.__proto__.constructor==Super)//true
     console.log(sub1.__proto__.__proto__==Super.prototype)//true

js基礎知識:閉包,事件處理,原型