js面向對象精要-函數

函數聲明 or 函數表達式

函數聲明

  • 以function開頭,有名稱
function add (){

    }
複製代碼

函數表達式

  • 沒有函數名稱,是個匿名函數。會被賦值到一個變量。
  • 結尾要有逗號。
var add = function(){

    };
複製代碼

函數聲明會被提高,函數表達式不會。

// 函數聲明被提高
    add(1,2)
    function add(a,b){
        return a+b;
    }
    // 此時不會報錯


    // 函數表達式不會被提高
    add(1,2)

    var add = function(a,b){
        return a+b;
    };
    // 此時會報錯
複製代碼

函數參數

  • 參數都會被放到arguments裏面,arguments是一個類數組,不是真正的數組。可是有數組的方法。
console.log(Array.isArray(arguments)) //false
複製代碼

js中函數沒有重載

function log(){
        console.log(1)
    }

    function log(){
        console.log(2)
    }
    log()   //2
複製代碼

改變對象中的this指向

  • call()
  • call()的第一個參數是函數執行時this的值
  • call()的第二個參數是向函數中傳遞的參數
function obj(lable) {
       console.log(lable+':'+this.name)
   }

   var person1 = {
       name:'aaa'
   }

   var person2 = {
       name:'bbb'
   }

   var name = 'ccc'

   console.log(obj.call(this,'window')) //label:window
   console.log(obj.call(person1,'person1')) //label:person1
   console.log(obj.call(person2,'person2')) //label:person2
複製代碼
  • apply()
  • apply()的第一個參數是函數執行時this的值
  • apply()的第二個參數是向函數中傳遞的參數,爲數組或相似數組的對象
  • apply()的用法和call()同樣
function obj(lable) {
       console.log(lable+':'+this.name)
   }

   var person1 = {
       name:'aaa'
   }

   var person2 = {
       name:'bbb'
   }

   var name = 'ccc'

   console.log(obj.call(this,['window'])) //label:window
   console.log(obj.call(person1,['person1'])) //label:person1
   console.log(obj.call(person2,['person2'])) //label:person2
複製代碼
  • bind()
  • 第一個參數是綁定的this對象
  • 第二個參數無關緊要
function obj(lable) {
      console.log(lable+':'+this.name)
  }

  var person1 = {
      name:'aaa'
  }

  var person2 = {
      name:'bbb'
  }

  var aaa = obj.bind(person1)
  person('person1') //label:person1

  var bbb = obj.bind(person2,'person2')
  bbb() //label:person2

  bbb.sayname  = aaa;
  bbb.sayname('aaa') //label:aaa
  
複製代碼
相關文章
相關標籤/搜索