6.函数式编程
-
什么是函数?
说白了,函数就是一段代码块和数据的集合,讲这些代码块和数据都封装到了一个盒子里,只留一个入口和出口,这样的一种结构就是函数。
-
什么是函数式编程?
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
-
函数是一种特殊的对象
-
创建方法:
- 构造函数
- 函数声明
- 函数表达式
/*
函数是一种特殊的对象,它可以存储一段可执行的代码块
创建方法
- 构造函数
- 函数声明
- 函数表达式
*/
var a,b,c,d;
// 构造函数,一般不使用
var fun1 = new Function("console.log('hello 这是第一个函数~~');");
a = 10;
b = 20;
// 函数声明 利用function关键字 函数名([形参1,形参2...形参N])
function fun2(){
console.log('hello 这是第二个函数~~');
}
// 函数表达式,创建一个构造函数再用一个变量接收
var fun3 = Function()
{
console.log('hello 这是第三个函数~~');
};
fun1();
fun2();
fun3();
/*
return 返回值,没有定义时会返回一个Undefine ,返回值可以是任意类型
传入参数也可以是任意数据类型
*/
function sum(num1 , num2 ){
return num1 + num2;
}
var sum = sum(5,6);
console.log(sum);
function isPrimeNumber(num){ // 判断是否是一个质数
if(num < 2 )
{
return false;
}
for(var i = 2;i<=Math.sqrt(num);i++)
{
if (num % i == 0 ) {
return false;
}
}
return true;
}
console.log(isPrimeNumber(656));
-
对象的方法:就是把函数作为对象的属性赋给一个对象,这就是对象的方法
/* 对象的属性值也可以是一个函数,此时我们叫这个函数为这个对象的方法; */ var obj = new Object(); obj.name = "孙悟空"; obj.age = 800; obj.sayName = function(){ console.log("你好,我是"+obj.name); } obj.sayName(); /* 枚举对象的属性 */ for(var n in obj){ // console.log("属性名:" + n); console.log(n + ":" + obj[n]) }
-
作用域:
- 作用域指的是变量的作用范围
- 全局作用域
- 函数作用域【局部作用域】
- 在全局作用域中有一个全局对象Window,我们可以直接使用
- 在全局作用域中所创建的变量都会作为window的属性保存
- 全局作用域
- 作用域指的是变量的作用范围
/*
作用域指的是变量的作用范围
- 全局作用域
- 函数作用域【局部作用域】
- 在全局作用域中有一个全局对象Window,我们可以直接使用
- 在全局作用域中所创建的变量都会作为window的属性保存
*/
var a = 123;
console.log(a);
console.log(window.a);
- 函数作用域
- 调用函数时,函数作用域被创建,函数执行结束时函数作用域被销毁;
- 每次调用函数就会创建一个新的函数作用域,他们之间是相互独立的
- 在函数中可以访问全局作用域- 当在函数中操作一个变量时,会先在函数中寻找,再依次往上找,直至全局作用域,如果全局作用域中依旧没有则会报错
- 在函数中要访问全局变量可以用 window.变量名 的形式访问
- 在函数中用 var 关键字 创建变量会在函数最开始声明
- 在函数中不使用 var 关键字声明的变量都会变成全局变量
- 每次调用函数就会创建一个新的函数作用域,他们之间是相互独立的
/*
- 调用函数时,函数作用域被创建,函数执行结束时函数作用域被销毁;
- 每次调用函数就会创建一个新的函数作用域,他们之间是相互独立的
- 在函数中可以访问全局作用域
- 当在函数中操作一个变量时,会先在函数中寻找,再依次往上找,直至全局作用域,如果全局作用域中依旧没有则会报错
- 在函数中要访问全局变量可以用 window.变量名 的形式访问
- 在函数中用 var 关键字 创建变量会在函数最开始声明
- 在函数中不使用 var 关键字声明的变量都会变成全局变量
*/
var a = 123
function fun1(){
var a = 456;
console.log("我是fun1");
fun2();
function fun2(){
b = 789;
console.log("我是fun2");
}
}
fun1();
console.log(b); //789
console.log(a); //123
-
变量声明和加载顺序
-
变量的声明
-
使用 var 关键字创建的变量,会在所有代码之前被执行声明
-
如果声明变量时不使用 var 关键字,则不会被提前执行声明
-
-
函数的声明
- 使用function 关键字声明的函数会在所有代码之前被声明创建函数,即可以在函数声明前调用函数
- 使用函数表达式创建的函数不会被声明提前,所以不能再声明前被调用
/*
变量的声明
- 使用 var 关键字创建的变量,会在所有代码之前被执行声明
- 如果声明变量时不使用 var 关键字,则不会被提前执行声明
函数的声明
- 使用function 关键字声明的函数会在所有代码之前被声明创建函数,即可以在函数声明前调用函数
- 使用函数表达式创建的函数不会被声明提前,所以不能再声明前被调用
*/
// console.log(a); // 报错
a = 123;
console.log(a);
console.log(b); //undefine
var b = 123;
fun();
// fun2(); //报错
function fun(){
console.log("我是一个函数");
}
var fun2 = function(){
console.log("我是一个函数");
}
- 立即执行函数
/*
函数定义完,立即执行的函数
*/
(function(){console.log("hello , 我是匿名立即执行函数");})();