函数的理解

本文详细介绍了JavaScript中的函数概念,包括其作为封装功能的工具、提高代码复用性和易读性的作用,函数声明与表达式的区别,立即执行函数的用法,以及函数作用域、参数传递和调用规则。深入剖析了浏览器执行过程中的函数预编译和执行流程。
摘要由CSDN通过智能技术生成

什么是函数:

        1.用来实现特定的功能的,多条语句的封装体

2.只有函数类型的数据是可以执行的,其他的都不可以

为什么要用函数?

  1. 提高复用性
  2. 便于阅读交流

函数声明

        ①以function开头的为函数声明

        ②函数声明不能被执行符号执行

函数表达式

           ①不是以function开头的均可以被称为函数表达式

​           ②函数表达式的函数名没有实际意义,所以函数表达式自动放弃函数名

​           ③没有名字的函数,称之为匿名函数

​           ④函数表达式可以直接被执行符号所执行

​           ⑤函数声明可以在前面加上某些运算符号,使其变成函数表达式,例如:+,-,!...

立即执行函数

        语法:

                1.(function (){}());

                2.(function (){})();

        注意:

                1.团队协作,避免别人语法不规范的时候,我们一般会在立即执行函数前面加上“;”

                ;(function (){}());

函数也是对象

  1. instanceof Object===true;
  2. 函数有属性:prototype
  3. 函数有方法: call()/apply()
  4. 可以添加新的属性/方法

三种不同的函数

  1. 一般函数 :直接调用
  2. 构造函数 :通过new调用
  3. 对象:调用内部的属性/方法

        

函数的作用域

        作用域是指变量存在的范围。

        Javascript只有两种作用域:

        一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取

        另一种是函数作用域,变量只在函数内部存在

        在函数外部声明的变量称为全局变量,它可以在函数内部读取。在函数内部定义的变量,

        外部无法读取,称为局部变量。函数内部定义的变量,会在该作用域内覆盖同名全局变量。

        注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全          局变量。

        全局作用域:预编译分析出来的GO就称之为全局作用域

                直接书写在脚本中的代码

                特点:在全局作用域中声明的变量,会被提升到脚本块的顶部,并且会成为全局对象的                  属性。

        函数作用域:预编译分析出来的AO就称之为某个函数的函数作用域

                函数中的代码

                特点:在函数作用域中声明的变量,会被提升到函数的顶部,并且不会成为全局对                       象的属性.

函数的参数

        函数运行时提供的外部数据叫参数,Javascript允许省略参数。

  1. 如果函数参数是数值、字符串、布尔值,那么传递方式是传值传递,在函数体内修改参数值,不会影响到函数外部
  2. 如果函数参数是数组、对象、其他函数,那么传递方式是传址传递,在函数内部修改参数,将会影响到原始值

函数的调用

        调用函数时,要使用圆括号运算符。圆括号之中,可以加入函数的参数。
        return:函数体内部的return语句,表示返回,直接返回后面的表达式的值,即使return语句            后还有其他语句,也不会得到执行。但是return语句不是必需的,如果没有的话,该函数就          不返回任何值,或者说返回undefined。

浏览器执行JavaScript的过程

        1.语法分析:基本语法检测,有没有基本的语法错误,例如中文标点符号等

        2.预编译(预解析):

                1. 全局预编译:

                        ① 全局执行代码之前,生成一个GO(Global Object)

                        ②分析变量的声明,var a

​                                   如果GO对象上有没有a属性,如果没有,则直接添加a属性,值为undefined

​                                   如果GO对象上已经存在a属性,则不做任何操作

                        ③分析函数声明,function fn

​                                   如果GO对象已经存在fn属性,直接将整个函数体覆盖,如果不存在就添加                                    fn 属性,值为函数体

                2. 函数预编译:

                        ①函数运行前的一瞬间,生成Active Object(活动对象),后面简称AO

                        ②函数声明的参数(形参),形成AO对象的属性名,属性值为实参的值,未传递                                实参则为undefined

                        ③分析变量声明,如 var a

                                 如果AO对象上还没有a属性,则添加AO属性,值为undefined

                                 如果AO对象上已经有a属性,则不做任何影响

                        ④分析函数声明,如 function foo(){}

                                 则把函数赋给foo属性

                                 如果此前foo属性存在,则覆盖

        3.逐行执行

                浏览器按照预编译分析出来的AO,GO(Global Object分析步骤只是预编译中少了                      第二个步骤)。逐行执行代码

                注:分析过了变量、函数声明的就不用管。后续只需要管赋值即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值