概念: 在js中,函数就是个对象,函数名就是个指向函数对象的指针
1, js函数的三种声明方式
1.1, 函数声明, 函数表达式, 使用Fuction构造函数生成实例
- 1,函数声明
// 语法
function sayName(name) {
console.log(name)
}
- 2,函数表达式
// 语法
var sayName = function(name){
console.log(name)
}
- 3,使用Fuction构造函数生成实例
// 前面都是函数参数,最后一个字符串参数表示函数体
var sum = new Function("num1", "num2", "num1+num2")
// 不推荐的原因:
// 1. 需要两层解析,一是函数解析,二是对内部字符串的解析,耗性能
// 1. 书写麻烦,函数体还不能写复杂
1.2, 函数声明和函数表达式的区别
-
几个概念
-
解析器,就是对js源码进行一定规则解析,然后交给执行环境执行
-
执行环境,js源码真正运行的环境
-
js解析器的规则有点特殊,有两个提升(变量提升, 函数声明提升)
- 变量提升: 源码中声明的变量会被被解析器提取出来,在源码逐行执行前被执行,此时变量会被赋值为undefined
- 声明函数提升: 声明函数会被整体提升到代码执行前,所以在声明函数之前就调用该函数,是不会报错的,因为该函数已经被提升到执行环境的头部了
-
-
区别
- 函数表达式,只会提升它的变量,该变量为undefined,只有当代码执行该函数所在的位置时,该变量才会被真正指向该函,所以在函数表达式之前的调用,都会导致脚本报错
- 声明函数会被提升,提前引用不会报错
1.3 函数的属性和方法
-
内部属性this和arguments
- this,表示调用函数的对象的引用
- arguments,函数参数组合而成的类数组
-
函数本身的属性和方法
- length, 返回函数参数的个数
- apply()、call()、bind(), 用于函数继承并修改内部this指向
2, js函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式
1, 方法调用模式
// , 请注意this此时指向myobject
var myobject={
value:0,
inc:function(){
console.log(this.value) // 0
}
}
myobject.inc()
2, 函数调用模式
// 请注意this此时指向window
var add=function(a,b){
console.log(this)//this被绑顶到window
return a+b;
}
var sum=add(3,4);
console.log(sum)
3, 构造器调用模式
JS是一门基于原型继承的语言,这意味着对象可以直接从其他对象继承属性
如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将绑定到那个新对象上
// javascript语言精粹一书建议摒弃这中方式
function Person(){
this.name = "zhangsan";
this.age = 19;
this.sayHello = function(){
console.log(1)
};
}
var p = new Person();
p.sayHello(); // 1
4, call(),apply()调用模式(上下文调用模式)
// apply的第一个参数就是this指针要指向的对象
var myobject={};
var sum = function(a,b){
console.log(this)
return a+b;
};
var sum2 = sum.call(myobject,10,30);
//var sum2 = sum.apply(myobject,[10,30]);
console.log(sum2);
3, js函数的种类(普通函数, 匿名函数, 闭包函数)
普通函数
// 普通函数示例
function ShowName(name) {
console.log(name);
}
- 1, Js中同名函数的覆盖只会调用后面的
- 2, arguments对象
function showNames(name) {
console.log(name);//张三
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);//张三、李四、王五
}
}
showNames('张三','李四','王五');
- 3若函数没有指明返回值,默认返回的是'undefined'
// 若函数没有指明返回值,默认返回的是'undefined'
function showMsg() {
}
console.log(showMsg());//输出:undefined
匿名函数
-
1, 变量匿名函数(可以把函数赋值给变量、事件)
- 说明: 变量匿名函数,左侧可以为变量、事件等
- 适用场景: 避免函数名污染。若先声明个带名称的函数,再赋值给变量或事件,就造成了函数名的滥用
var anonymousNormal = function (p1, p2) {
console.log(p1+p2);
}
anonymousNormal(3,6);// 9
- 2, 无名称匿名函数
- 说明: 即在函数声明时,在后面紧跟参数。Js语法解析此函数时,里面代码立即执行
- 适用场景: 只需执行一次的。如浏览器加载完,只需要执行一次且后面不执行的功能
(function (p1) {
console.log(p1);
})(1); // 1
闭包函数
-
定义:函数A内部声明了个函数B,函数B引用了函数B之外的变量,并且函数A的返回值为函数B的引用。那么函数B就是闭包函数
-
适用场景: 保证函数funA内里的变量安全,因为外部不能直接访问funA的变量
- 1, 全局引用与局部引用
- 2, 有参闭包函数
- 3, 父函数funA内的变量共享
4, js有7种数据类型
- null, undefined, boolean, number, string, 引用类型(object、array、function), symbol