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)。

  1. 分析函数参数
  • 将函数的形参添加为AO属性,属性的默认值为undefined
  • 接收函数的实参,并覆盖原属性值。
  1. 分析变量声明/分析局部变量
  • 若AO中不存在与声明的变量所对应的属性,则添加AO属性为undefined
  • 若AO中已存在与声明的变量所对应的属性,则不做任何修改。
  1. 分析函数声明
  • 若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属性已经存在,则被覆盖掉了。