什么是函数:
1.用来实现特定的功能的,多条语句的封装体
2.只有函数类型的数据是可以执行的,其他的都不可以
为什么要用函数?
- 提高复用性
- 便于阅读交流
函数声明
①以function开头的为函数声明
②函数声明不能被执行符号执行
函数表达式
①不是以function开头的均可以被称为函数表达式
②函数表达式的函数名没有实际意义,所以函数表达式自动放弃函数名
③没有名字的函数,称之为匿名函数
④函数表达式可以直接被执行符号所执行
⑤函数声明可以在前面加上某些运算符号,使其变成函数表达式,例如:+,-,!...
立即执行函数
语法:
1.(function (){}());
2.(function (){})();
注意:
1.团队协作,避免别人语法不规范的时候,我们一般会在立即执行函数前面加上“;”
;(function (){}());
函数也是对象
- instanceof Object===true;
- 函数有属性:prototype
- 函数有方法: call()/apply()
- 可以添加新的属性/方法
三种不同的函数
- 一般函数 :直接调用
- 构造函数 :通过new调用
- 对象:调用内部的属性/方法
函数的作用域
作用域是指变量存在的范围。
Javascript只有两种作用域:
一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取。
另一种是函数作用域,变量只在函数内部存在。
在函数外部声明的变量称为全局变量,它可以在函数内部读取。在函数内部定义的变量,
外部无法读取,称为局部变量。函数内部定义的变量,会在该作用域内覆盖同名全局变量。
注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全 局变量。
全局作用域:预编译分析出来的GO就称之为全局作用域
直接书写在脚本中的代码
特点:在全局作用域中声明的变量,会被提升到脚本块的顶部,并且会成为全局对象的 属性。
函数作用域:预编译分析出来的AO就称之为某个函数的函数作用域
函数中的代码
特点:在函数作用域中声明的变量,会被提升到函数的顶部,并且不会成为全局对 象的属性.
函数的参数
函数运行时提供的外部数据叫参数,Javascript允许省略参数。
- 如果函数参数是数值、字符串、布尔值,那么传递方式是传值传递,在函数体内修改参数值,不会影响到函数外部。
- 如果函数参数是数组、对象、其他函数,那么传递方式是传址传递,在函数内部修改参数,将会影响到原始值。
函数的调用
调用函数时,要使用圆括号运算符。圆括号之中,可以加入函数的参数。
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分析步骤只是预编译中少了 第二个步骤)。逐行执行代码
注:分析过了变量、函数声明的就不用管。后续只需要管赋值即可