JS基础(五)
一、arguments使用
当不确定有多少个参数传递的时候,可以用 arguments 来获取。JavaScript 中,arguments实际上它是当前函数的一个内置对象。
具有以下特点:
- 是一个伪数组
- 具有数组length属性
- 可以按照索引的方式进行存贮
- 没有真正数组 的一些方法,如:push、pop
- 只有函数有arguments对象,每个函数都内置好了arguments
二、函数声明
1、自定义函数命名方式(命名函数)
利用函数关键字function自定义函数
function 函数名 (){...}
函数名();//调用,可以放在函数前或后
2、函数表达式(匿名函数)
var 变量名 = function(){...};
变量名();//调用,必须放在函数体下面
三、作用域
1、定义
- 限定这个变量名字的可用性的代码范围就是这个名字的作用域。
- 提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
2、全局作用域
作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件。
3、局部作用域
作用于函数内的代码环境,就是局部作用域。
4、块级作用域
js中没有块级作用域
四、变量
1、全局变量
在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。
- 注意:如果在函数内部,没有声明直接赋值的变量也属于全局变量
- 只有在浏览器关闭的上海才会销毁,比较占内存
- 全局变量在代码的任何位置都可以使用
2、局部变量
在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
- 只能在函数内部使用
- 函数内部声明的变量就是局部变量
- 函数的形参实际上就是局部变量
- 当我们程序执行完毕就会销毁
五、作用域链
1、定义
只要是代码都一个作用域中,写在函数内部的局部作用域,未写在任何函数内部即在全局作用域中;
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;
根据在**[内部函数可以访问外部函数变量]**的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
2、作用域链:
采取就近原则的方式来查找变量最终的值。
六、预解析
1、js引擎如何执行 js代码
先进行语法校验,再进行预解析,最后执行代码
-
预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。
-
代码执行: 从上到下执行JS语句。
预解析会把变量和函数的声明在代码执行之前执行完成。
1、语法校验阶段报错:
整个js 文件都不会运行 (了解)
2、代码执行阶段报错:
从当前位置开始下面的js 都不会执行 (了解)
2、变量预解析
变量提升(变量预解析): 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升。
3、函数预解析
函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。
函数表达式提升? 不存在函数提升,只存在变量提升
(拓展)函数和变量同时提升:
// 函数声明的优先级高于变量声明,但不高于变量赋值
七、对象(object)
1、定义
对象是一组无无序的相关属性和方法的集合,所有的事物都是对象
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示(常用动词)
2、创建对象的三种方法
1、字面量创建对象
var 变量名 = {
属性1:'',
属性2:'',
方法名:function(){...};//方法冒号后面跟的是匿名函数
}//注意:属性之间要用逗号隔开
调用对象属性:
(1)console.log(变量名.属性1)
(2)console.log(变量名['属性1'])
调用对象方法:
变量名.方法名;
2、利用new Object 创建对象
var andy = new Obect();
添加对象属性使用的格式:对象.属性 = 值;
3、利用构造函数创建对象
格式:
function 构造函数名(形参1,形参2,形参3) {
this.属性名1 = 参数1;
this.属性名2 = 参数2;
this.属性名3 = 参数3;
this.方法名 = 函数体;
}
调用格式:
var obj = new 构造函数名(实参1,实参2,实参3)
- 构造函数约定首字母大写。
- 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
- 构造函数中不需要 return 返回结果。
- 当我们创建对象的时候,必须用 new 来调用构造函数。
3、new关键字执行过程★★★★★
- 首先在内存中新增一块内存空间,存放将要创建的对象
- 用this关键字指向内存空间
- this添加属性方法
- 添加完成后,返回这个this,完成创建对象
4、遍历对象
for (变量 in 对象名字) {
for (变量 in 对象名字) {
// 在此执行代码
}
for (var k in obj) {
console.log(k); // 这里的 k 是属性名
console.log(obj[k]); // 这里的 obj[k] 是属性值
}