JS函数内容详解(适合初学者)

JS函数部分详解!!!

在程序中,函数其实就是一组处理特定问题的代码的集合,JavaScript中的函数和java中的方法类似,但是却没有java方法那么严谨,相比之下,它的语法更随便,更简单。

函数的定义方式

方式1:使用构造函数创建

var fun1 = new Function("console.log('我是fun1')");

上述方式是使用到了”构造函数“的方法来创建的函数对象,可以将函数体字符串的形式封装在双引号(" ")内部,当然,函数体内部的字符串就必须使用单引号(’ ')来定义了,有一个口诀:”外单内双 或 外双内单“。也就是说外层用单引号就内部就用双引号,相反也是一样的。

但在实际开发中,很少使用这种方式来创建函数对象,使用typeof()检查一个函数对象时,会返回function类型

方式2:使用函数声明创建

function 函数对象名称([形参1,形参2,形参..n]){
    //函数体;
}
[]:表示是可选项

方式3:使用函数表达式创建

var 函数对象名称 = function([形参1,形参2,形参..n]){
    //函数体;
}

在实际开发中,主要使用方式2和方式3来定义函数对象!!


函数的分类

有参函数:表示函数对象带有一个或多个参数,参数可用作函数内部的数据操作

先看一段代码来了解一下有参函数:

function test1(num1, num2){
    console.log(num1+num2); //输出num1+num2的值
}
//调用函数
test1(1,3); // 输出 4

注意:在Java中,方法的形参必须指定类型,而在js中,形参不需要指定类型,因为js只有一个var类型

无参函数:表示函数对象的参数列表中可以没有参数
function test2(){
    console.log('我是无参函数~');
}
test2(); //输出: 我是无参函数~
//即使你在test2()中传入参数,js中也不会报错,因为实参没有对应的实参
立即执行函数:函数定义完,立即被调用
(function(){
	alert('我是一个匿名函数');
})(); 	//该函数可以传入参数

该函数的特点就是往往只执行一次,并且属于一个匿名函数(即没有名字的函数),执行完成之后,你就找不到它了,因为你没有使用变量保存它的地址,它执行完就消失在内存中了。

构造函数:

构造函数其实就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写,构造函数与普通函数的区别就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字来调用

//构造函数的创建
function Person(name){ 
    //this表示的就是调用该函数的对象
	this.name = name;
}
//使用构造函数来创建一个Person对象
var per1 = new Person('张三');
console.log(per1.name); //输出 '张三' 

使用同一个构造函数创建的对象,我们称其为 “一类” 对象,也将一个构造函数称为一个 “ 类 ”。我们将通过一个构造函数来创建对象,该对象称为是该类的实例。

构造函数的执行流程:

  1. 立即创建一个新的对象
  2. 将新建的对象设置为构造函数中的this,那么构造函数中的this就是调用该构造函数的对象
  3. 逐行执行函数中的代码
  4. 将新建的对象作为返回值返回

函数的作用域

什么是作用域?

举一个简单的例子,假如张三同学在菜鸟中学读书,那么在他们学校吃饭都是需要饭卡刷卡的,此时张三同学的这个饭卡就只能在菜鸟中学食堂使用,是不是走出了这个食堂,他的饭卡就没有用了,只有在这个食堂中,他的饭卡才起作用,那么饭卡的作用域就是食堂。

函数作用域的特点:

  1. 函数作用域是在函数被调用时创建的 ,函数执行完毕之后,该作用域将被销毁。
  2. 每调用一次函数就会创建一个新的完全且完全独立的函数作用域
  3. 在函数作用域中可以访问到全局作用域中的变量,而在全局作用域中却无法访问到函数作用域中的变量(重点)
  4. 当全局作用域和函数作用域中都存在同一名称的变量时,函数作用域优先选择自身的变量(就近原则),当函数作用域中不存在该变量时,则取全局作用域中的变量的值
  5. 当遇到函数嵌套时:内层函数先从自身寻找变量,不存在则向外一步步扩大寻找,直到找到为止,若一直找到全局作用域中都没有找到时,则会报ReferenceError错误

注:在函数中没有使用var类型声明的变量都会成为全局变量

函数的声明提前

使用函数声明的方式:function 函数名(){..}定义的函数,会在所有的代码执行之前就被创建,所以我们可以在函数声明之前就调用该函数,并且不会报错。具体实现看以下代码:

//调用该fun1函数
fun1(); //输出 ‘我是使用函数声明创建的函数fun1’
function fun1(){ //该函数会在所有代码执行之前被执行
	alert("我是使用函数声明创建的函数fun1");
	return;
}

若是使用 ”函数表达式“ 这种方式定义的函数,则该函数不会被声明提前,所以不能在声明前调用该函数,但函数名已经存在,属于undefined类型,但是调用函数时是不存在的,若强行调用,则会报错。

函数的返回值

在java中,每个方法都可以有一个返回值或无返回,而在js中,函数无论如何都会有返回值,如果不写return语句或者写return;则都会返回undefined

其他情况写什么就会返回什么,并且js中的返回值可以是任何的数据类型。

注意:当return语句后接多个使用逗号分隔的数据时,return会返回最后一个值

function n1(){
    this.name = '李四';
	return 1,false,3,name; 
}
console.log(n1());//返回:'李四'

简述 函数名 和 函数名() 的区别

假如现在有一个函数function test(){..},那么test 和 test()的区别是:

test():表示的就是调用函数对象,例如将其传给另一个函数:fun(test()),就是将test()的返回值作为参数传递给fun()函数。

test:表示的就是函数对象,如果将其传给另外一个函数,例如fun(test),相当于直接使用函数对象作为参数进行传递,参数就是对应的函数对象,而不是值。

以上就是本次讲解的所有内容,如果觉得写的还不错的话,可以点赞收藏喔,你们的支持才是我最大的动力!!! 谢谢大家!!!

你可能感兴趣的:(javascript,前端,开发语言)