JavaScript Function 属性 方法;call()、apply()、bind()相同与区别

229 阅读2分钟

JavaScript数据类型

基本类型

  • number:数字类型
  • string:字符串类型
  • boolean:布尔类型

特殊类型

  • null:空对象数据
  • underfined:未定义的任何数据类型

复杂类型

  • array:数组类型
  • object:对象数据类型

类型事件函数

Function


javaScript函数(对象 --> 函数)

属性

  • arguments[]  已废弃
    传递给函数的参数数组,不推荐使用。

  • caller   非标准
    指向调用它的那个函数。如果是全局调用,则该属性为null。caller只有函数执行过程中才有效。不推荐使用

  • length
    声明函数时指定的形参个数。

  • prototype
    一个给构造函数用的对象。用构造函数创建的所有对象会共享 prototype 对象定义的属性和方法

  • name
    返回一个函数声明的名称

方法:

  • Function.apply()
    将函数作为指定对象的方法来调用。传递给它的是指定的参数数组。(立即调用对象方法)

  • Function.call()
    将函数作为指定对象的方法来调用。传递给它的是指定的参数。(立即调用对象方法)

  • Function.bind()
    返回一个新函数。通过可选的指定参数,作为指定的方法调用该方法

  • Function.toString()
    将函数转换成字符串

JavaScript 中 call()、apply()、bind() 的用法与区别

例 1

var name = '小王', age = 17;
var obj = {
    name: '小张',
    abjAge: this.age,
    myFun: function() {
        console.log(this.name + '年龄' + this.age);
    }
}

obj.objAge; // 17
obj.myFun(); // 小张年龄 undefined

例 2

var fav = '盲僧';
function shows() {
    console.log(this.fav);
}

shows() // 盲僧

总结:两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window。

call()、apply()、bind() 都是用来重定义 this 这个对象的!

var name = '小王', age = 17;
var obj = {
    name: '小张',
    abjAge: this.age,
    myFun: function() {
        console.log(this.name + '年龄' + this.age);
    }
}

var db = {
    name: '德玛',
    age: 99
}

obj.myFun.call(db);    // 德玛年龄 99
obj.myFun.apply(db);    // 德玛年龄 99
obj.myFun.bind(db)();   // 德玛年龄 99

总结:以上出了 bind 方法后面多了个 () 外 ,结果返回都一致。bind 返回的是一个新的函数,你必须调用它才会被执行。

对比call 、bind 、 apply 传参情况下

var name = '小王', age = 17;
var obj = {
    name: '小张',
    abjAge: this.age,
    myFun: function(fm, t) {
        console.log(this.name + ' 年龄 ' + this.age , ' 来自 ' + fm + '去往' + t);
    }
}

var db = {
    name: '德玛',
    age: 99
}

obj.myFun.call(db,'成都','上海');       // 德玛 年龄 99  来自 成都去往上海
obj.myFun.apply(db,['成都','上海']);    // 德玛 年龄 99  来自 成都去往上海  
obj.myFun.bind(db,'成都','上海')();     // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined

总结:微妙的差距!call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,差别在于第二个参数。

  1. call 第二个参数开始用逗号分隔。
  2. apply 第二个参数是用数组包起来。
  3. bind 除了返回是函数以外,它 的参数和 call 一样