JavaScript基础学习笔记 第五天

107 阅读5分钟

Arguments 使用

  • 语法
function functionName() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    console.log(sum);
}
functionName(1,2,3,4,5,6);
// 只有函数才具有 arguments 对象
// 里面储存所有传递过来的的实参
// 但是不推荐使用 ! 但是需具备能看懂的能力	
  • 伪数组 (例如 : 上述的Arguments)

    • 1、不是真正意义上的数组
    • 2、具有数组 length 属性
    • 3、伪数组是按照索引的方式进行存储的
    • 4、不具备真正数组的一些方法如: pop() push()

函数的相互调用

  • 因为每个函数都是独立的代码块,所以可以相互调用
function functionName1(parament) {
    console.log(output1);
}
function functionName2(parament) {
    functionName1();
    console.log(output2);
}
console.log(functionName2());
// output : output1 
//          output2

函数的声明方式

  • 函数关键字自定义函数(命名函数)

  • 函数表达式 (匿名函数)

var functionVar = function() {};
// 1 \ functionVar 是变量名不是函数名
// 2 \ 函数表达式声明方式与声明变量差不多,只不过变量里存的是值,而函数表达式里面存的是函数
// 3 \ 函数表达式也可以传参
// 4 \ 不要忘了写分号

JavaScript作用域 (ECMAScript 5)

  • JavaScript作用域 : 就是代码在某个范围内有作用 , 目的是为了提高程序的可靠性更重要的是减少命名冲突。
  • 全局作用域
    • 对于整个Script标签或者整个js文件
  • 局部作用域 (函数作用域)
    • 在函数内部即为局部作用域 , 这个代码只在函数内部有效
    • 函数作用域优先级高于全局作用域 (在函数内来说)
  • 全局变量 (全局函数)
    • 在全局作用域之下的变量 , 在全局都可以使用的
    • 在任何位置不定义直接赋值的 , 也是全局变量 (不建议使用)
    • 只有在浏览器关闭之后才会被销毁
  • 局部变量 (局部函数)
    • 在局部作用域之下的变量 , 在函数内部可以使用的
    • 函数的形参也是局部变量
    • 在代码块完成之后久被销毁

javaScript (ECMAScript 5) 没有块级作用域

  • if () {} 或者 for () {} 等中定义的变量或者函数 , 在块级外部可以被调用

作用域链

  • 定义 : 内部函数访问外部函数的变量 , 采取链式查找的方式 , (逐级向上级寻找) 这种操作被称之为作用域链 (就近原则)

JavaScript 预解析

预解析 (此处有无聊的面试题)

  • js 引擎运行 js
    • 预解析 : js 引擎会把 js 内部所有的 var 还有 function 提升到当前作用域的最前面 (只提升声明 , 不提升赋值)
    • 代码执行 : 预解析会将 , 变量与函数的声明在代码执行之前解析完成 , 所以预解析也被叫做 : 变量 \ 函数提升

JavaScript 对象

对象

  • 什么是对象 :

    • 万物皆对象 , 对象是一个具体的事物 , 对象不是泛指
    • 在 JavaScript 中对象是一组无序的相关属性和方法的集合 : 
      • 属性 : 事物的特征 , 在对象中用属性来表示 n.
      • 方法 : 事物的行为 , 在对象中用方法来表示 v.
  • 为什么需要对象

    • js对象可以使得表达结构更加清晰

创建对象的三种方式

  • 以对象字面量创建
var objectName = {
    attribute1 : num1,
    attribute2 : num2,
    attribute3 : num3,
}
// 属性和方法我们采取简直对的形式 ; 键 属性名 ; 值 属性值
// 多个属性用逗号隔开
// 方法冒号后面 , 写入的是一个匿名函数
// 属性名如果不符合变量命名规范 , 就必须使用 对象名['属性名'] 的形式去访问

// 调用

objectName.attribute1;
objectName.attribute2;

// or

objectName['attribute1'];
objectName['attribute2'];
  • 变量 \ 属性 \ 函数 \ 方法之间的区别

变量 与 属性 : 属性是对象的一部分 , 而变量不是 , 变量是单独封装操作的容器

变量 : 单独声明 \ 赋值 , 单独存在 属性 : 对象里面的变量称为属性 , 不需要声明 , 用来描述对象的特征

函数 与 方法 : 方法是对象的一部分 , 而函数不是 , 函数单独封装操作的容器

函数 : 单独存在 , 通过 : 函数名 + () 就可以被调用 方法 : 对象内部的函数被称之为方法 , 不需要声明 , 使用 对象名 + . + 方法名 + () 就可以调用 , 方法用来描述对象的行为与功能

  • New创建对象
var objectName = new Object();
objectName.attribute1 = num1;
objectName.attribute2 = num2; // 添加属性 \ 方法

// 调用类似
  • 构造函数创建对象

    • 使用函数的方法重复相同的代码 , 我们把这个函数称之为 : 构造函数

    • 构造函数封装的是对象 , 或者说构造函数就是来创建对象的

    • 构造函数 就是把对象内部相同的属性和方法抽象出来封装到函数内

    • 语法格式:

    function FunctionName(num1, num2, num3) { // 构造函数名一首字母大写 , 且不需要加入 return 就能返回值
        this.attribute1 = num1; // this 必须要加
        this.attribute2 = num2;
        this.attribute3 = num3;
    }
    
    var person1 = new FunctionName(num1, num2, num3); // 必须使用 new 
    
    // 如果 console.log(typeof(person1)); 那么 output:&emsp;object 
  • 注意的几点

    • 构造函数可以理解为一类对象的模板
    • 通过 new 构造函数创建的对象 , 可以理解为 : 使用这个模板生成的实例
  • 构造函数 , 抽象了对象的公共部分 , 封装到了函数内部 , 它泛指某一大类

  • 创建对象 , 特指某一个 , 通过 new 关键字创建对象的过程 , 也称之为对象的实例化

  • new 关键字的步骤

    1. 创建一个空对象
    2. 把创建出来的这个对象赋值给 this
    3. 给 this 添加属性和方法
    4. 返回 this

遍历对象

  • 示例 :
function Student(theName, theId, theSex, theGrade) {
    this.name = theName;
    this.id = theId;
    this.sex = theSex;
    this.grade = theGrade;
    this.sayHi = function () {
        return ('你好~');
    }
}
var studentList1 = new Student('小明', '24152200055', '男', '八年级');
for (var key in studentList1) {
    if (typeof (studentList1[key]) == 'function') {
        console.log(studentList1[key]()); // 如果 是 方法 直接调用
    } else {
        console.log(key + ':' + studentList1[key])
    }
}
console.log(studentList1.sayHi() + '我是' + studentList1.name);