JavaScript函数
今日大纲:
一.函数
1.函数的定义
2.函数中的arguments的参数
3.函数的全局变量和局部变量
4.作用域
二.词法分析(尝试理解)
三.内置对象和方法
1.自定义对象
2.Date对象
3.Json对象
4.RegExp对象
5.Math对象
一.函数
1.函数的定义
1>普通定义
function f1() { console.log("HelloWorld!"); }
2>带参数的函数定义
function f2(a,b) { console.log(arguments); consloe.log(arguments.length); consloe.log(a,b); }
3>代返回值的函数
function sum (a,b){ return a+b; }
4>匿名函数的定义
var sum = function(a,b){ return a+b; } sum(1,2)
5>立即执行函数
(function(a,b){ ruturn a+b; }) (1,2)
补充:
ES6中允许使用"箭头" (=>) 定义函数.
var f = v => v; //等同于 var f = function(v){ return v; }
如果箭头函数不需要参数或者需要多个参数,就是用括号代表参数部分:
var f = () => 5; // 等同于 var f = function () {return 5}; var sum = (num1,num2) => num1+ num2; //等同于 var sum = function(num1,num2){ ruturn num1+num2 }
2.函数中的arguments参数
function add (a+b){ console.log(a+b); console.log(arguments.length); } add(1,2) 输出结果是: 3 2
注意:!!!!!!
函数只能有一个返回一个值,如果要返回多个值,只能将其放在数组或对象中返回.
3.函数的全局变量和局部变量
局部变量 : 在JavaScript函数内部声明的变量是局部变量,所以只能在函数内部访问它.只能 函数运行结束完毕,本地变量就会被删除.
全局变量 : 在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它.
变量生存周期 : JavaScript变量的生命期从它们被声明的时间开始
局部变量会在函数结束以后被删除
全局变量会在页面关闭之后被删除
4.作用域
作用域法则: 首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层.
例题1
var city = "BeiJing"; function f() { var city = "ShangHai"; function inner(){ var city = "ShenZhen"; console.log(city); } inner(); } f(); //输出结果是? ShengZhen
例题2
var city = "BeiJing"; function Bar() { console.log(city); } function f() { var city = "ShangHai"; return Bar; } var ret = f(); ret(); // 打印结果是? BeiJing
例题3----闭包
var city = "BeiJing"; function f(){ var city = "ShangHai"; function inner(){ console.log(city); } return inner; } var ret = f(); ret();
输出结果是:
ShangHai
二.词法分析(尝试理解)
JavaScript中,在调用函数的一瞬间,会先进行词法分析.
词法分析的过程:
当函数调用的前一瞬间,会先形成一个激活对象,Active Object (AO) 并分析以下3个方面
1.函数参数,如果有,则将此参数赋值给AO ,且值为undefind 如果没有,则不做任何操作.
2.函数局部变量,如果AO上有同名的值,则不做任何操作.如果没有,则将此变量赋值给AO,并且值为undefined
3.函数声明,如果AO上有,则会将AO上的对象覆盖,如果没有,则不做任何操作
例题1:
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); } foo(); // 问:执行foo()之后的结果是? undefined 22
例题2:
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); function age(){ console.log("呵呵"); } console.log(age); } foo(); // 执行后的结果是?
三.内置对象和方法
1.自定义对象
JavaScript的对象,本质上是键值对的集合,但是只能用字符串作为键.
var a = {"name":"ALEX","age":18}; console.log(a.name); console.log(a["age"]);
遍历对象中的内容:
var a = {"name":"ALEX","age":18}; for (var i in a){ console.log(i,a[i]); }
创建对象:
var person = new Object(); // 创建一个person对象 person.name = "ALEX"; // person对象的name属性 person.age = 18 // person 对象的属性
2.Date对象
创建Date对象
// 方法1:不指定参数 var d1 = new Date(); console.log(d1.toLocaleString()); // 方法2 : 参数为日期字符串 var d2 = new Date("2018/9/5 11:12"); console.log(d2.toLocaleString()); var d3 = new Date("04/03/20 11:12"); console.log(d3.toLocaleString()); // 方法3 参数为毫秒 var d3 = new Date(5000); console.log(d3.toLocaleString()); console.log(d3.toUTCString()); //方法4 : 参数为年月日小时分钟秒毫秒 var d4 = new Date (2004,2 20,11,12,0,300); console.log(d4.toLocaleString()); //毫秒并不直接显示
Date对象的方法:
var d = new Date(); //getDate() 获取日 //getDay() 获取星期 //getMonth() 获取月(0-11) //getFullYear() 获取完整年份 //getYear() 获取年 //getHours() 获取小时 //getMinuters() 获取分钟 //getSeconds() 获取秒 //getMilliseconds 获取毫秒 //getTime 返回累计毫秒数(从1970/1/1午夜)
3.Json对象
var str1 = "{"name":"ALex","age": 18}"; var obj1 = {"name":"Alex","age":18}; //序列化-----对象转换成字符串 var str = JSON.stringify(obj1); // 反序列化 -------对象转换成对象 var obj = JSON.parse(str1);
4.RegExp对象
// RegExp 对象 // 创建RegExp对象方式(都逗号后面不要加空格) var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); // 匹配响应的字符串 var s1 = "bc123" //RegExp对象的test方法,测试一个字符串是否符合对应的规则,返回值是true或false reg1.test(s1); //true