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
  
复制代码
相关文章
相关标签/搜索