A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

JavaScript函数四种调用模式详解

如遇问题可联系武汉校区
更多学习资源等着你哦~

函数总共有四种调用模式,分别为 函数调用模式、方法调用模式、构造器调用模式、上下文调用模式。这里主要给大家介绍一下四种模式的语法以及其中比较难理解的this指向问题。


函数模式调用
语法:函数名(参数)

特例:任何自调用函数(立即执行函数)都是函数模式
    // 自调用函数
    (function () {
        console.log(this);
    })();

方法模式调用
概念: 方法本身就是函数,但是方法不是单独独立的调用,而是通过一个对象引导调用
语法: 对象.方法名(参数)
    var o = {};
    o.fn = function () {
        console.log(this);
    };
    o.fn();
方法模式调用下的this:方法模式调用下的this就是引导调用该方法的对象。
注意:方法调用一定要有宿主对象。方法一定是某个对象的方法,此对象可以是任何对象。
构造器模式调用
语法: 使用new关键字引导
function Person() {
    this.name = 'zs';
    this.age = 18;
    this.gender = '男'
};
// 构造器模式调用
var p = new Person();
返回值:
1、如果不写return语句,那么 构造函数 默认返回this
2、如果构造函数中写上return,并紧跟基本类型,则忽略基本类型数据,返回this
上下文模式
上下文调用模式分为两种:call调用 和apply调用 以及bind 绑定式调用
apply形式
语法:函数名.apply(参数)
function foo() {
        console.log(this);
    }
    var o = { name: 'zs' };
    // 如果需要让函数以函数模式调用, 可以使用
    foo.apply(null) 或 foo.apply()

    // 如果希望方法模式调用, 需要提供一个宿主对象
foo.apply(o);
使用 apply 进行调用,如果函数是带有参数的. apply 的第一个参数要么是null 要么是对象
如果是 null 就是函数调用, 如果是 对象就是 方法调用, 该对象就是宿主对象. 后面紧跟一个数组参数, 将函数的参数依次放在数组中.
function foo(num1, num2) {
        console.log(this);
        return num1 + num2;
    }
    // 函数调用模式
    // var res1 = foo( 123, 567 );
    // 方法调用
    var o = { name: 'jim' };
    // o.func = foo;
    // var res2 = o.func( 123, 567 );
    // 改写成 apply 形式
    var res1 = foo.apply(null, [123, 567]); // 函数调用
    var res2 = foo.apply(o, [123, 567]); // 方法调用
call形式
使用 call 进行调用,如果函数是带有参数的. call 的第一个参数要么是 null要么是对象
如果是 null 就是函数调用, 如果是 对象就是 方法调用, 该对象就是宿主对象. 后面紧跟一个函数的所有参数,使用逗号分隔(和apply功能一模一样,唯一区别就是传参形式不同)
function foo(num1, num2) {
    console.log(this);
    return num1 + num2;
}
var o = { name: 'jim' };
// 改写成 call 形式
var res1 = foo.call(null, 123, 567); // 函数调用
var res2 = foo.apply(o, 123, 567); // 方法调用
bind绑定对象实现方法调用
function fn() {
        console.log(this);
    };
    var o = {
        name: 'zs',
    };
    var f = fn.bind(o); // 给函数fn绑定了对象
    f(); // 虽然是函数调用模式,但是打印的this是绑定的对象,实现了函数的方法调用模式
四种模式this指向

对于函数的上下文调用模式在JavaScript核心代码中使用的非常频繁,这里面比较难理解的就是各种调用的情况下this的指向。只要使用了call和apply调用函数 ,那么函数内部的this 就指向 这两个方法的第一个参数,如果第一个参数没传或者传的是null,那么this指向window。对于bind ,就是绑定一个对象到函数执行上下文环境中,所以使用过bind的函数 ,那么this永远指向 绑定的这个对象,即使是再次使用call和apply也无法改变this的指向了。
另外,对于其他的三种函数调用模式,this指向也是有规律可循,函数调用模式下 this 指向的是window,方法调用模式下 this 指向 调用该方法的对象,而构造器模式调用(即使用new关键字)this默认指向new出来的对象。

28 个回复

倒序浏览
居然没有人抢沙发?
回复 使用道具 举报
感谢楼主
回复 使用道具 举报
感谢分享
回复 使用道具 举报
函数调用模式函数调用模式
回复 使用道具 举报
紫薯布丁。。
回复 使用道具 举报
新手学习中1111111111
回复 使用道具 举报
主要是影响变量提升的问题
回复 使用道具 举报
trxic 初级黑马 2017-8-16 20:10:17
9#
顶起 支持一下
回复 使用道具 举报
函数调用模式函数调用模式
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
1234567891011
回复 使用道具 举报
666666666666
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
看看怎么样
回复 使用道具 举报
有哪个新手来着抢沙发的,都去html了.
回复 使用道具 举报
看一看,多了解一下,感谢
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
newu 黑马帝 2017-10-21 22:13:04
17#
谢谢分享,楼主厉害,支持楼主
回复 使用道具 举报
好。。。。。。。。。。。。。
回复 使用道具 举报
googogooggooe
回复 使用道具 举报
村上春树村上春树村上春树村上春树
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马