javascript一些比較難理解的知識點

原文出處:http://www.javashuo.com/article/p-rxdsbktm-h.htmlsegmentfault

看了一下這篇文章,本身也手敲了一遍數組

    //一、 當即執行函數   做用:將var變量的做用域限制於函數內,這樣能夠避免命名衝突。注意:避免報錯 在開頭加分號

    ;
    (function() {
        console.log("一、當即執行函數")
    })()

    //二、閉包   
    ;
    (function() {
        console.group("二、閉包")

        function f1() {
            var n = 0

            function f2() {
                n++
                console.log("n=" + n)
            }
            return f2
        }
        var result = f1()

        try {
            console.log(n) //undefind 
        } catch(e) {
            //            console.log(e)
        }

        result() //輸出1
        result() //輸出2
        result() //輸出3
        console.groupEnd()
    })()

    //三、使用閉包定義私有變量

    ;
    (function() {
        console.group("三、使用閉包定義私有變量")

        function Pronduct() {
            //            this.name = "mike";
            var name

            this.setName = function(v) {
                name = v
            }
            this.getName = function() {
                return name
            }
        }

        var k = new Pronduct()
        k.setName('amy')
        console.log(k.name) //undefined
        console.log(k.getName()) //輸出amy
        console.groupEnd()
    })()

    //四、prototype
    //每一個JavaScript構造函數都有一個prototype屬性,用於設置全部實例對象須要共享的屬性和方法。
    //prototype屬性不能列舉。JavaScript僅支持經過prototype屬性進行繼承屬性和方法。

    ;
    (function() {
        console.group("4.prototype")

        function Rectangle(x, y) {
            this._length = x;
            this._breadth = y;
        }
        Rectangle.prototype.getData = function() {
            return {
                length: this._length,
                breadth: this._breadth
            }
        }
        var x = new Rectangle(3, 4);
        var y = new Rectangle(5, 8);
        console.log(x.getData()) //輸出{length:3,breadth:4}
        console.log(y.getData()) //輸出{length:5,breadth:8}
        console.groupEnd()
    })()

    //五、模塊化
    ;
    (function() {
        console.group("5.模塊化")
        var module = (function() {
            var N = 5;

            function print(x) {
                console.log("The result is:" + x)
            }

            function add(a) {
                var x = a + N;
                print(x)
            }
            return {
                description: "This is descriptione",
                add: add
            }
        })()

        console.log(module.description) //輸出 "This is descriptione"
        module.add(5) //輸出 The result is:10
        console.groupEnd()
    })()

    //6.變量提高

    //JavaScript會將全部變量和函數聲明移動到它的做用域的最前面,這就是所謂的變量提高(Hoisting)。
    //也就是說,不管你在什麼地方聲明變量和函數,
    //解釋器都會將它們移動到做用域的最前面。所以咱們能夠先使用變量和函數,然後聲明它們。

    //七、柯里華
    //柯里化,即Currying,能夠是函數變得更加靈活。咱們能夠一次性傳入多個參數調用它;
    //也能夠只傳入一部分參數來調用它,讓它返回一個函數去處理剩下的參數。
    ;
    (function() {
        console.group('7.柯里華')
        var add = function(x) {
            return function(y) {
                return x + y;
            }
        }
        console.log(add(1)(1)) //輸出2
        var add1 = add(1)
        console.log(add1(2)) //輸出3
        var add10 = add(10)
        console.log(add10(2)) //輸出12
        console.groupEnd()
    })()

    //8.apply,call與bind方法
    //call  指定this值調用函數
    ;
    (function() {
        console.group('8.apply,call與bind方法')
        var user = {
            name: "mike",
            whatIsYourName: function() {
                console.log(this.name)
            }

        }
        console.group("call")
        user.whatIsYourName() //輸出 mike

        var user2 = {
            name: "amy"
        }
        user.whatIsYourName.call(user2) //輸出amy
        console.groupEnd()

        //apply apply方法與call方法相似。二者惟一的不一樣點在於,apply方法使用數組指定參數,而call方法單獨指定:
        ;
        (function() {
            console.group('apply')
            var user = {
                greet: "hello",
                greetUser: function(userName, name) {
                    console.log(this.greet + " " + userName + ' ' + name)
                }
            }
            var user2 = {
                greet: "hey"
            }

            user.greetUser.call(user2, 'mike', "ak") //輸出 hey mike ak
            user.greetUser.apply(user2, ['amy', "ak"]) //輸出 hey amy ak
            console.groupEnd()
        })()
        //bind 
        ;
        (function() {
            console.group('bind')
            var user = {
                greet: "Hello!",
                greetUser: function(userName) {
                    console.log(this.greet + " " + userName);
                }
            };

            var greetHola = user.greetUser.bind({
                greet: "Hola"
            });
            var greetBonjour = user.greetUser.bind({
                greet: "Bonjour"
            });

            greetHola("Rahul") // 輸出"Hola Rahul"
            greetBonjour("Rahul") // 輸出"Bonjour Rahul"
            user.greetUser('mike')
            console.groupEnd()
        })()

    })()
    
    
相關文章
相關標籤/搜索