JavaScript 函数

一、函数的定义与调用

1、定义

  • 函数的声明
 //函数声明
function info1() {
  console.log('函数声明');
}

函数声明必须有名字
函数声明会函数提升,在预解析阶段就已创建,声明前后都可以调用

info1();
//函数声明
function info1() {
  console.log('函数声明');
}
  • 函数表达式
//函数表达式
const info2 = function () {
     console.log('函数定义');
}

函数表达式类似于变量赋值
函数表达式可以没有名字,例如匿名函数
函数表达式没有变量提升,在执行阶段创建,必须在表达式执行之后才可以调用

2、调用

普通函数 函数()
构造函数 new 构造函数()
对象方法 对象.方法()

3、函数内this指向不同的场景

调用方式 非严格模式 备注
普通函数调用 window 严格模式下是 undefined
构造函数调用 实例对象 原型方法中 this 也是实例对象
对象方法调用 该方法所属对象 紧挨着的对象
事件绑定方法 绑定事件对象
定时器函数 window
//普通函数调用
    const info = function(){
        console.log('普通函数this  :',this);
    }
    // info();
  
    function Person(){
        console.log('构造函数this ',this);
        this.name = '构造函数'
        this.sayName = function(){
            console.log('对象方法this ',this);
        }
    } 
    Person.prototype.eat = function(){
        console.log('原型方式this :',this);
    }

    // Person.prototype.eat = () => {
    //     console.log('原型方式this :',this);
    // }

    const p = new Person();
    p.sayName();
    p.eat();

    const btn  = document.getElementById('btn');
    btn.onclick = function(){
        console.log('事件绑定this ',this);
    }

    setTimeout(function(){
        console.log('定时器this',this);
    },1000)

4、call、apple、bind方法的区别

函数对象的方法. : 在javascript中每一个函数都可以看作成一个对象,它对应的类型是Function

  • call、apple
        function info(name,age){
            console.log('info函数 :',this);
            console.log('name :',name,' ,age :',age);
        }

        Array.prototype.inverse = function(){
            console.log('Array this  :',this);
            // info();
            // info.call(this,'小明',17);
            info.apply(this,['小明',17]);
        }

call语法: 函数.call(obj,[参数列表]);
apple语法: 函数.apple(obj,[数组]);

  • bind

改变原函数中this指向

//普通函数
        this.x = 9;
       let module = {
            x: 81,
            getX: function () {
                return this.x;
            }
        };
//返回值
        const k = module.getX(); // 返回 81
        console.log('k ',k);

        let retrieveX = module.getX;
        const y = retrieveX(); 
        console.log('y ',y);

        // 创建一个新函数,将"this"绑定到module对象
        // 新手可能会被全局的x变量和module里的属性x所迷惑

        var boundGetX = retrieveX.bind(module);
        const a = boundGetX(); // 返回 81
        console.log('a ',a);

5、 自调用函数

立即执行函数,在创建后立即执行

(function(接收的变量y){
  //函数体
})(传入的变量x)
//把局部变量给父类就可以了

6、 高阶函数

函数可以作为参数也可以作为返回值

new Promise((resovel,rejected)=>{

})

其中promise参数就为函数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在JavaScript中,函数即对象,程序可以随意操控它们。比如,JavaScript可以把函数赋值给变量,或者作...
    kissLife阅读 971评论 0 0
  • 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用、信息...
    文顶顶阅读 533评论 0 6
  • 0.0 概述 本文总结了js中函数相关的大部分用法,对函数用法不是特别清晰的同学可以了解一下。 1.0 简介 同其...
    hard_man阅读 970评论 0 2
  • 目录 1.函数的声明 2.函数的属性和方法 3.函数的作用域 4. 函数的重载 5.闭包知识点 6.小结 关于函数...
    犯迷糊的小羊阅读 600评论 0 0
  • JavaScript因为其语法松散,导致函数(尤其是this)看似简单,其实里面花头很多。本篇介绍一下JavaSc...
    张歆琳阅读 2,435评论 1 17