<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ### 函數與箭頭函數 * 函數function * 箭頭函數 =>{ } * call、apply、bind、:: * rest參數與擴展運算符 * * * * * #### **函數function** > 函數對于任何一門編程語言來說都是核心概念,通過函數可以封裝多條語句,而且可以在任何地方任何時候去調用,es5中通過function關鍵字來聲明函數,后面跟一組參數以及函數體。在javascript中函數在定義時不必指定是否有返回值,但實際上任何函數都可以通過return語句后面跟上藥返回的值來實現定義返回值,同時函數中也可以嵌套函數,調用函數或者返回一個函數。案例如下: ~~~ function s(){ let b =1 return b } ~~~ > 上面代碼我們可以通過 s() 來調用,返回 1,這個函數執行完return語句后會立即退出,因此return后面的語句永遠不會被執行,例如: ~~~ function s(){ let b =1 return b console.log(2) //這里永遠不會被執行 } ~~~ > 在ES6之前,不能直接為函數的參數指定默認值,只能采用變通的方法。ES6 允許為函數的參數設置默認值,即直接寫在參數定義的后面。如下: ~~~ function log(x, y = 'World') { console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello ~~~ > 需要注意的是:參數變量是默認聲明的,所以不能用let或const再次聲明。而且函數默認值的作用域只在函數體中,外部不可使用。 > ES6 引入 rest 參數(形式為“...變量名”),用于獲取函數的多余參數,rest 參數搭配的變量是一個數組,該變量將多余的參數放入數組中,同時也可以使用map和set這種類似數組的值。案例如下: ~~~ function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3) // 10 ~~~ > 從ES5開始,函數內部可以設定為嚴格模式。《ECMAScript 2016標準》做了一點修改,規定只要函數參數使用了默認值、解構賦值、或者擴展運算符,那么函數內部就不能顯式設定為嚴格模式,否則會報錯。 #### **箭頭函數 =>{ }** > ES6允許使用“箭頭”(=>)定義函數。如下: ~~~ let f = v => v // let f 定義函數名,=v 指定了箭頭函數的參數v , =>指定了箭頭函數的返回值 v ~~~ > 上面的箭頭函數等同于: ~~~ let f = function(v) { return v } ~~~ > 如果箭頭函數不需要參數或需要多個參數,就使用一個圓括號代表參數部分。如下: ~~~ let f = () => 5 f() // 5 ~~~ > 如果箭頭函數內部有語句需要執行,可以使用 { } 來將它們括起來,并指定return語句,如下: ~~~ let f = (a,b) => { a = 1 b = 2 return a+b } f() // 3 ~~~ > 由于大括號被解釋為代碼塊,所以如果箭頭函數直接返回一個對象,必須在對象外面加上括號。如下: ~~~ let getTempItem = id => ({ id: id, name: "Temp" }); ~~~ > 下面是rest參數與箭頭函數結合的例子: ~~~ const numbers = (...nums) => nums; numbers(1, 2, 3, 4, 5) // [1,2,3,4,5] ~~~ #### **箭頭函數使用注意點:** * 函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象。 * 不可以當作構造函數,也就是說,不可以使用new命令,否則會拋出一個錯誤。 * 不可以使用arguments對象,該對象在函數體內不存在。如果要用,可以用Rest參數代替。(arguments對象是es5中獲取函數參數的對象,本文檔不會詳細解釋,因為用的少,而且ES6已經提供了rest參數) * 不可以使用yield命令,因此箭頭函數不能用作Generator函數。(javascript進階中會講到Generator函數和yield命令) > 上面四點中,第一點尤其值得注意。this對象的指向是可變的,但是在箭頭函數中,它是固定的。代碼如下: ~~~ function foo() { setTimeout(() => { console.log('id:', this.id); }, 100); } let id = 21; foo.call({ id: 42 }); // id: 42 ~~~ > 上面代碼中,setTimeout的參數是一個箭頭函數,這個箭頭函數的定義生效是在foo函數生成時,而它的真正執行要等到100毫秒后。如果是普通函數,執行時this應該指向全局對象window,這時應該輸出21。但是,箭頭函數導致this總是指向函數定義生效時所在的對象(本例是{id: 42}),所以輸出的是42。 > 另外,由于箭頭函數沒有自己的this,所以當然也就不能用call()、apply()、bind()這些方法去改變this的指向。(關于call,apply,bind這三個改變this指向的方法下面有講到) > 同時,箭頭函數內部也可以嵌套箭頭函數,除this指向外與function中嵌套function無異 #### **call、apply、bind、::(注意??:敲黑板)** * * * * * #### call > 在javascript編程中,this指向的是當前對象/調用對象,call方法可以指定函數內部this的指向(即函數執行時的作用域)然后在指定的作用域中調用該函數,如下: ~~~ function a(name,price){ this.name = name this.price = price } function b(name,price){ a.call(this,name,price) // 如果沒有使用call,那么當運行到這句代碼時this指向的是a this.category = "B" } let c = new b("andy",6000000000000000) console.log(c) //{b:{category:"B",name:"andy",price:6000000000000000,__proto__:Object}} ~~~ > call方法的第一個參數就是this所要指向的哪個對象,后面的參數是函數運行時所需要的參數。 > 上面代碼中,方法b中調用了a方法,在調用a方法時又使用了call指定了執行作用域為this,此時this指向的是b方法,如果沒有使用call,那么在運行這行代碼時this指向的是方法a #### apply > apply方法的作用域call類似,也是改變this指向,然后再調用該函數,唯一的區別就是,它接收一個數組作為函數執行時的參數,如下: ~~~ function y (o,i){ console.log(o+i) } f.call(null , 1 ,1) //2 f.apply(null,[1,2]) //3 ~~~ #### bind > bind方法用于將函數體內的this綁定到某個對象,然后返回一個新函數,如下: ~~~ let n ={ name:"andy", age:22 } function c(){ let name = "tom" let age = "25" console.log(this.name) console.log(this.age) } let f = c.bind(n) f() // andy 22 ~~~ #### :: (注意這兩個冒號) > 這兩個冒號可不是我失誤打上去的,而是ES7中新增的一種改變this指向的語法,用于替代上面的call、apply、bind,代碼如下: ~~~ let foo = {} let bar = {} bar::foo //將foo的this指向綁定到bar對象上 ~~~ #### **rest參數與擴展運算符** #### rest參數 > ES6引入了rest參數(‘...a//自定義的變量’),用于獲取函數的多余參數,這樣就不需要使用arguments對象了,rest參數搭配的自定義變量是一個數組,該變量將多余的參數放入這個數組中。如: ~~~ function add(...a){ let n = 0 for(let i of a){ n+=i } return n } add(4,6,10) // 20 ~~~ > 上例add函數是一個求和函數,利用rest參數可以想該函數傳入任意數目的參數。rest參數中的變量代表一個數組,所以數組特有的方法都可以用于這個變量,類似的數組操作如下: ~~~ function push(array,..items){ items.forEach(function(item){ array.push(item) console.log(item) }) } let a = [] push(a,1,2,3,4,5,6) console.log(a) // [1,2,3,4,5,6] ~~~ > 在使用rest參數時一定要注意,rest參數后不可以再有任何其他參數,即:“rest參數只能是函數的最后一個參數”,否則會報錯。同時函數的length屬性中也不包括rest參數。 #### 擴展運算符 > 擴展運算符是三個點(...),它好比是rest參數的逆運算,將一個數組轉為用逗號分隔的參數序列。如: ~~~ console.log(...[1,2,3]) // 1 2 3 console.log(1,...[2,3,4],5) // 1 2 3 4 5 ~~~ > 擴展運算符也可以用來合并數組,如: ~~~ //ES5合并數組寫法 [1,2,3].concat([4,5]) //[1,2,3,4,5] //ES6擴展運算符寫法 [1,2,3,...[4,5]] //[1,2,3,4,5] ~~~ > 也可以在解構運算中使用擴展運算符,如: ~~~ let [a,...b] = [1,2,3,4] console.log(a) // 1 console.log(b) // [2,3,4] ~~~ > 在使用擴展運算符對數組賦值時,擴展運算符只能放在最后一位,否則會報錯。 > 除了數組以外,擴展運算符也可以將一個字符串/對象/Map/Set等數據結構轉為數組。 > 在javascript中,函數只能返回一個值,如需返回多個值,只能返回數組或對象,擴展運算符提供了一種變通的方法,可以將函數返回的數組或對象通過擴展運算符直接傳入其他函數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看