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: object
-
注意的几点
- 构造函数可以理解为一类对象的模板
- 通过 new 构造函数创建的对象 , 可以理解为 : 使用这个模板生成的实例
-
构造函数 , 抽象了对象的公共部分 , 封装到了函数内部 , 它泛指某一大类
-
创建对象 , 特指某一个 , 通过 new 关键字创建对象的过程 , 也称之为对象的实例化
-
new 关键字的步骤
- 创建一个空对象
- 把创建出来的这个对象赋值给 this
- 给 this 添加属性和方法
- 返回 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);