一、函数的概念
函数是一段可以反复调用的代码块。
作用:在程序设计中,常将一些常用的功能模块编写成函数,以减少重复编写程序段的工作量。提高代码的复用性、可读性等
二、函数的创建方式(函数的声明)
(1)function 命令
function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号。函数体放在大括号里面。
function 函数名称() {
函数中要执行的代码;
}
function print() {
console.log(1);
}
上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应的代码。这叫做函数的声明
(2)函数表达式
除了用function命令声明函数,还可以采用变量赋值的写法。
var print = function() {
console.log(1);
};
这种写法将一个匿名函数(没有名字的函数)赋值给变量。这时,这个匿名函数又称函数表达式
函数的执行(调用)
函数定义好之后,函数中的代码在程序运行过程中不会执行;
function print() {
console.log(1);
}
通过函数名称调用函数,调用时执行函数中的代码;调用函数时,要使用圆括号运算符print();
三、事件的概念种类
事件:就是发生的事情
事件驱动:就是发生了某件事情之后要处理的手段和过程
参数的声明
函数名后面是一对圆括号,里面是传入函数的参数
function 函数名称(参数列表){
函数体中的代码;
}
函数定义的时候的参数,称为形参
function print(s) {
console.log(s);
}
function add(a,b) {
console.log(a+b);
}
参数的传递
print(1);
调用函数的时候,传入了 参数 1,1的值给了形参s。
函数调用时候传入的参数叫做实参
函数的返回值
JavaScript 引擎遇到return语句,就直接返回return后面的那个表达式的值,后面即使还有语句,也不会得到执行。也就是说,return语句所带的那个表达式,就是函数的返回值。
注、return语句不是必需的,如果没有的话,该函数就不返回任何值,或者说返回undefined。
function add(x, y) {
return x + y; //返回x+y的和
}
var res = add(1, 1) ;//把函数的返回值 赋值给 变量res
console.log(res);//2
变量的声明提升
函数内部会产生“变量提升”现象。在函数内部使用var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部。
function foo(x) {
if (x > 100) {
var tmp = x - 100;
}
}
// 等同于
function foo(x) {
var tmp;
if (x > 100) {
tmp = x - 100;
};
}
五、arguments
由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
var f = function (one) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
}
f(1, 2, 3)
通过arguments对象的length属性,可以判断函数调用时到底带几个参数。
六、作用域
作用域(scope)指的是变量存在的范围。
局部作用域和全局作用域在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。
函数外部声明的变量就是全局变量(global variable)
在函数内部定义的(使用var)变量,外部无法读取,顾称为“局部变量”(local variable)
var v = 1;//全局变量
function f() {
var b = 2;//局部变量
console.log(b);
console.log(v);//它在函数内部可以读取全局变量,但是局部变量的不能再函数外部访问
}
f()
上面的代码表明,函数f内部可以读取全局变量v。
函数内部定义的变量,会在该作用域内覆盖同名全局变量。
var v = 1;
function f(){
var v = 2;
console.log(v);
}
f() // 2
v // 1
上面代码中,变量v同时在函数的外部和内部有定义。结果,在函数内部定义,局部变量v覆盖了全局变量v。
注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
if (true) {
var x = 5;
}
console.log(x); // 5
上面代码中,变量x在条件判断区块之中声明,结果就是一个全局变量,可以在区块之外读取。
七、递归函数:函数可以调用自身,这就是递归。简单来说,就是函数自己执行过程中,调用自己本身。
递归的步骤:
1.先找临界值,即无需计算 就能获取的值
2.找本次 和上一次的关系 f(n) = f(n-1)+n (数学归纳)
3.假设当前函数已经可以使用了,调用自身计算上一次的运行结果,再写出本次运行结果 即可
八、构造函数及对象类型(了解)
面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
面向对象编程的第一步,就是要生成对象。对象是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后对象根据这个模板生成
JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构。
构造函数就是一个普通的函数,但是有自己的特征和用法。
function Vehicle () {
this.price = 1000;
};
上面代码中,Vehicle就是构造函数。为了与普通函数区别,构造函数名字的第一个字母通常大写。
构造函数的特点有两个。 函数体内部使用了this关键字,代表了所要生成的对象实例。生成对象的时候,必须使用new命令。new命令的作用,就是执行构造函数,返回一个实例对象。
function Vehicle () {
this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
上面代码通过new命令,让构造函数Vehicle生成一个实例对象,保存在变量v中。这个新生成的实例对象,从构造函数Vehicle得到了price属性。new命令执行时,构造函数内部的this,就代表了新生成的实例对象,this.price表示实例对象有一个price属性,值是1000。