Function 函数对象

126 阅读3分钟

*****Function:函数对象 - 方法

创建:3种

1、声明方式

 function 函数名(形参列表){函数体;return 结果;}
 具有完整的声明提前	

2、直接量方式

var 函数名=function(形参列表){函数体;return 结果;}
也有声明提前,但是赋值留在原地

3、构造函数方式 - 函数体不是固定的

var 函数名=new Function("形参1","形参2",...,"函数体");
函数体是动态拼接时候,注意不能省略""部分

调用

  • 函数名();
  • 元素.onclick();

考点:

1、***创建:

2、***作用域:

全局(成员哪里都可以使用)、函数(成员只能在函数调用时内部可用) 变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错

作用域:2种

1、全局作用域:成员 随处可用,可以反复使用,容易被污染

2、函数作用域:成员 只有当前函数调用时内部可用,调用完了,就会释放了,一次性

作用域链scope chain:

*** 面试:

以EC中的scope chain属性为起点,经过AO逐级引用,形成的一条链式结构,就称之为叫做作用域链

作用:查找变量

3、***声明提前:

  1. 在程序正式执行之前,会将var声明的变量和function声明的函数集中提前到当前作用域的顶部,
  2. 但是赋值留在原地
  3. 变量比函数轻

4、***按值传递:

如果传递的是原始类型,互不影响。如果传递的是引用类型,相互影响。

5、***重载:

相同的函数,根据传入的实参的不同,会自动选择对应的函数执行

  • 为什么:减少程序员的负担

  • 问题: JS不支持重载,JS不允许同时存在多个同名函数,如果存在,最后的一个会覆盖之前的所有函数

    解决:arguments对象 - 只能在函数内部可用,是一个类数组对象: 作用:接住所有的实参,【以后甚至不用形参都可以了】

  • 只有3点相同

    1、支持下标
    2、支持length
    3、支持遍历
    
    变相实现重载:通过判断arguments的不同,执行不同的操作
    

6、***匿名函数:

理解概念

没有名字的函数,没有变量名/函数名引用着,调用完毕后会立马释放 - 一次性函数

类型:2种:

1、匿名函数自调:代替全局作用域
	(function(){
		函数体; - 好处:调用完毕会【立刻释放】
	})()

2、匿名函数回调:某个函数调用时,传入的实参又是一个函数,而且不需要我们调用自动执行
	比如:
	arr.sort(function(a,b){return a-b})
	str.replace(reg,function(){})
	***你要认识什么叫做回调函数:
	

匿名函数,不是自调,就一定是回调 - 以后会学习箭头函数:简化一切的回调函数

*** 函数的执行原理:

  • 1、程序加载时

    创建执行环境栈(ECS):保存函数调用顺序的数组
    首先压入全局执行环境(全局EC)
    全局EC中引用着全局对象window
    window中保存着全局变量
    
  • 2、定义函数时

    创建函数对象:封装函数的定义
    在函数对象中创建scope属性,记录着自己来自的作用域
    全局函数的scope都是window
      
    
  • 3、调用函数前

    在执行环境栈ECS压入新的函数的EC
    创建活动对象AO:保存着本次函数调用时用到的局部变量
    在EC中添加scope chain属性引用AO
    设置AO的parent属性为函数的scope引用的对象
    
  • 4、调用时

    变量的使用规则:优先使用局部的,局部没有才找全局,全局没有才报错
    
  • 5、调用完

    函数的EC会出栈,AO会自动释放,局部变量也就自动释放了
    

举例

函数执行原理图.png