JavaScript (二)
定义函数:
function f1() { console.log('第一个JS函数') } f1(); // 带参数的函数 function f2(a) { console.log(a) } f2('hello world!'); f2('带参数的函数'); // 匿名函数 sum = function (a, b) { return a + b; } ret = sum(1, 2); console.log('匿名函数的值为' + ret); eat = function (apple) { // console.log(apple); return apple; } r = eat('wahha'); console.log(r); // 立即执行函数 (function (x) { console.log('立即执行'); return x; })(1);
箭头定义函数
使用箭头函数注意几点:
1、函数体内的this对象就是定义时所在的对象,而不是使用时所在对象;
2、不可以当作构造函数使用,也就是不能用new命令实例化一个对象,否则会抛出一个错误;
3、不可以使用arguments对象,该对象在函数体内不存在,如果要用的话,可以用rest参数代替;
4、不可以使用yield命令,箭头函数不能用作Generator函数;
function f(v) { return v } r1 = f('这是标准版'); console.log(r1); f = v => v; r2 = f('这是简约版'); console.log(r2);
/*需要参数 函数名 = 参数 = >函数体; 函数名(实参)*/ function f(v) { return v } r1 = f('这是标准版'); console.log(r1); f = v => v; r2 = f('这是简约版'); console.log(r2); /*不需要参数 */ // 函数名 = () => 函数体 function f1() { return console.log('标准版不需要参数'); } f1(); f2 = () => console.log('简约版不需要参数'); f2();
函数中的参数 只能返回一个值,要返回多个值,必须放在数组或对象中返回
add = (a,b) => console.log(a+b); // console.log(arguments.length) 箭头定义函数 不能用arguments.length add(1,2);
function add(a,b){
console.log(a+b);
console.log(arguments.length)
}
add(1,2);
局部变量,作用域
city = "BeiJing"; function f() { city = "ShangHai"; function inner(){ city = "ShenZhen"; console.log(city); } inner(); } f(); //输出结果是? 深圳 自己的作用域中有,就直接调用 city = "BeiJing"; function Bar() { console.log(city); } function f() { city = "ShangHai"; return Bar; } ret = f(); ret(); // 打印结果是? 上海 自己作用域中没有 找上级, 上级找不到找外层 var city = "BeiJing"; function f(){ function inner(){ console.log(city); } return inner; } var ret = f(); ret(); // 打印结果是? 北京 自己作用域中没有 找上级, 上级找不到找外层
自定义对象 对象其实就是 {键值对的集合 hash结构 }
var a = {'name':'alex','age':18}; console.log(a.name); console.log(a.age); for (var i in a){ console.log(i,a[i]) } 新建一个对象 var person = new Object(); person.name = 'alex'; person.age = 19; console.log(person); for (var i in person){ console.log(i,person[i]); } var m = new Map(); var o = {p:'wakaka'}; m.set(o,'新加的o');
词法分析
词法分析的具体步骤:在函数运行的瞬间,会生成一个活动对象(AO, Active Object)。
- 分析函数参数
- 将函数的形参添加为AO属性,属性的默认值为
undefined
。 - 接收函数的实参,并覆盖原属性值。
- 分析变量声明/分析局部变量
- 若AO中不存在与声明的变量所对应的属性,则添加AO属性为
undefined
。 - 若AO中已存在与声明的变量所对应的属性,则不做任何修改。
- 分析函数声明
- 若AO中存在与函数名所对应的属性,则覆盖原属性为一个函数表达式。
function t(age){ var e = 2; var age = 10; function age() { } } t(2); 具体步骤: 1、 函数在运行前的瞬间,会生成一个活动对象(Active Object),简称AO。 2、分析函数的参数,并将其作为AO的属性,默认值全部为underfined,如: AO{age=underfined}。 3、分析函数接受到的参数,并将参数内容设置到对象的AO属性上,如: AO{age=2} 4、分析函数内部的变量声明,如var age,如果AO上还没有age属性,则添加AO属性,值是undefined;如果AO上已经有age属性则不做任何影响。如: AO{age=2, e=undefined} 5、分析函数声明,并将函数赋给成AO的属性。 AO{age= function(){}, e=undefined} 注意:由于age属性已经存在,则被覆盖掉了。