首先: JS中所有事物都是对象,对象是拥有属性和方法的数据。所以函数也是对象
当创建一个函数的时候,发生了什么?
实际上,函数是Function类型的实例,此时可以把每一个创建出来的函数,当成是Function类型的实例对象,所以函数本身拥有的对象属性,
来源于FunctionFn.Constructor 即为 Function
但是与此同时要注意: Function.prototype._proto=== Object.prototype
可以理解为: 构造器函数的构造函数是object
也可以简单的理解:
函数即对象
声明函数的几种方式
- 普通函数声明
- 声明函数 函数表达式
- 构造函数
- 匿名函数
1. 函数表达式
函数声明和函数表达式的区别:
- 函数声明会将函数提升到最前面(即使你写代码的时候,代码在最后才写这个函数),成为全局函数;
- 函数声明要指定函数名,而表达式不用,可以作为匿名函数使用
//函数表达式 let fun2 = function () { console.log("2"); } fun2();
2. 构造函数
在 JavaScript 中,用 new 关键字来调用的函数,称为构渣函数。构造函数首字母一般大写
举个例子,我们要录入一年级一班中每一位同学的个人信息,那么我们可以创建一些对象
var p1={ name:"a", age: 1,gender:"男",hobby:"basketball"}; var p2={ name:"b", age:1,gender:"女",hobby:"football"}; var p3={ name:"c", age: 1,gender:"女",hobby:"table tennis"}; var p4={ name:"d", age: 1,gender:"男",hobby:"onfoot"};
但是这样太麻烦了 要写4个 所以我们就可以构建一个实例对象
function Person(name, gender, hobby) { this.name = name; this .gender = gender; this.hobby = hobby; this.age = 6; } var p1 = new Person('zs' ,'男','basketbal1');
(1) 当以 new 关键字调用时,会创建一个新的内存空间,标记为 Animal 的实例
(2) 函数体内部的 this 指向该内存,每当创建一个实例的时候,就会创建一个新的内存空间
(3) 给 this 添加属性,就相当于给实例添加属性
(4) 由于函数体内部的this指向新创建的内存空间,默认返回 this ,就相当于默认返回了该内存
3. 自执行匿名函数
声明式会导致函数提升,function会被解释器优先编译。即我们用声明式写函数,可以在任何区域声明,不会影响我们调用
自执行函数也叫立执行函数
是将函数的声明和调用合并在一起
大体分为两种自执行匿名函数
作用:
立即执行函数会形成一个单独的作用域,我们可以封装一些临时变量或者局部变量,避免污染全局变量;
第一种写法
;(function () { //代码块 })()
第二种写法
;(function () { // 代码块 }())