二 前端基础之JavaScript

一、函数1.1 函数定义JavaScript中的函数和Python中的非常相似,只是定义方式有点区别 。
// 普通函数定义function f1() {console.log("Hello world!");}// 带参数的函数function f2(a, b) {console.log(arguments);// 内置的arguments对象console.log(arguments.length);console.log(a, b);}// 带返回值的函数function sum(a, b){return a + b;}sum(1, 2);// 调用函数// 匿名函数方式var sum = function(a, b){return a + b;}sum(1, 2);// 立即执行函数 ==> 书写立即执行的函数,首先先写两个括号()()这样防止书写混乱(function(a, b){return 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){return num1 + num2;//这里的return只能返回一个值,如果想返回多个值需要自己手动给他们包一个数组或对象中}1.2 函数中的arguments参数function add(a,b){console.log(a+b);console.log(arguments.length); console.log(arguments[0]);//arguments相当于将传入的参数全部包含,这里取得就是第一个元素1}add(1,2)输出:
321注意:
函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回 。
1.3 函数的全局变量和局部变量

  • 局部变量
    在JavaScript函数内部声明的变量(使用var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部) 。只要函数运行完毕,本地变量就会被删除 。
  • 全局变量
    在函数外声明的变脸就是全局变量,网页上的所有脚本和函数都能访问它 。
  • 变量生存周期
    • JavaScript变量的生命期从它们被声明的时间开始 。
    • 局部变量会在函数运行以后被删除 。
    • 全局变量会在页面关闭后被删除 。
1.4 作用域首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层 。与Python作用域关系查找一模一样!
几个例子:
  1. var city = "BeiJing"; function f() {var city = "ShangHai";function inner(){var city = "ShenZhen";console.log(city);}inner(); }f();//输出结果是ShenZhen
  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中在调用函数的那一瞬间,会先进行词法分析 。
词法分析的过程:
当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面:
  1. 函数参数,如果有,则将此参数赋值给AO,且值为undefined 。如果没有,则不做任何操作 。
  2. 函数局部变量,如果AO上有同名的值,则不做任何操作 。如果没有,则将此变量赋值给AO,并且值为undefined 。
  3. 函数声明,如果AO上有,则会将AO上的对象覆盖 。如果没有,则不做任何操作 。
函数内部无论是使用参数还是使用局部变量都到AO上找 。
看两个例子:
  1. var age = 18; function foo(){console.log(age);var age = 22;console.log(age); }foo();// 问:执行foo()之后的结果是?
    二 前端基础之JavaScript

    文章插图
  2. var age = 18; function foo(){console.log(age);var age = 22;console.log(age);function age(){console.log("呵呵");}console.log(age); }foo();// 执行后的结果是?
    二 前端基础之JavaScript

    文章插图
答案解析:
词法分析过程:
  1. 分析参数,有一个参数,形成一个 AO.age=undefined;
  2. 分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,因此不做任何处理
  3. 分析函数声明,有一个 function age(){...} 声明,则把原有的 age 覆盖成 AO.age=function(){...};
最终,AO上的属性只有一个age,并且值为一个函数声明
执行过程:
注意:执行过程中所有的值都是从AO对象上去寻找
1、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,所以第一个输出的一个函数;
2、这句 var age=22; 是对 AO.age 的属性赋值,此时AO.age=22,所以在第二个输出的是 22;
3、同理第三个输出的还是22, 因为中间再没有改变age值的语句了;
三、内置对象和方法JavaScript中的所有事物都是对象:字符串、数字、数组、日期等等 。在JavaScript中,对象是拥有属性和方法的数据 。
之前在学习基本数据类型的时候已经带大家了解了,JavaScript中的Number对象、String对象、Array对象等 。
注意var s1 = "abc"和var s2 = new String("abc")的区别:typeof s1 --> string 而 typeof s2 --> Object
二 前端基础之JavaScript

文章插图
3.1 自定义对象JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键 。
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对象的age属性注意: