JavaScript基础(五)
变量的多种声明方式对作用域访问的影响
不规范的声明方式(不推荐)
不加var声明,直接进行赋值: sum = 100;
var 变量名1 = 变量名2 = 变量名3 = 数据; 只有变量名1是标准方式。
不规范的变量声明方式导致作用域的访问出现变量,可能会隐式的声明为全局变量
作用域链
作用域链是用来描述 变量访问 规则的一种方式。
在任意作用域下进行变量访问时的规则:(沿作用域链向上查找)
首先查找当前作用域,如果存在就使用
如果不存在,会查找父作用域,如果存在就使用
最终查找到全局作用域,如果存在就使用
如果还是不存在,根据使用方式,有两种情况
如果是取值,报错
如果是赋值,会隐式声明全局变量-
预解析
预解析:js代码在执行之前解析器对代码预先进行了解析操作。
预解析进行的操作一共有2个
变量提升:找到当前作用域中的变量声明部分var
,将声明提升到作用域顶端
函数提升:找到当前作用域中的函数声明语句
,将函数体提升到作用域顶端
注意:函数表达式不适用于这个规则
arguments操作
含义:表示函数本次调用传入的所有实参
使用场景:当形参和实参的个数不对应时可以使用arguments操作
本质:本质上是伪数组(类数组)
只具有索引和长度,不具有数组特殊功能(例如push功能)的一种数据形式
// 例如:对传入的所有数值进行求和
function getSum () {
// 遍历arguments,获取元素后进行求和即可
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
console.log(getSum(1, 2, 3, 4, 5));
console.log(getSum(1, 2, 3, 4, 5, 6, 7, 8, 9));
函数的其他使用方式
命名函数和匿名函数:
命名函数:有名字的函数
匿名函数:没有名字的函数
因为没有名字,所以不能单独使用
自调用函数(立即执行函数) --- (会写,能认识即可)
(function () {
console.log(‘这是自调用函数‘);
})();
// 注意:结尾的;必须加
效果:在书写位置执行一次
作用:用来减少全局变量的使用
可以在书写多个功能时减少命名的冲突
提高代码的执行效率(减少变量名的检索次数)
回调函数(会写,能认识即可)
含义:指的是某个函数作为参数使用的形式。
命名函数和匿名函数都可以作为回调函数使用
注意:传入命名函数时,不要加()
递归函数(会写,能认识即可)
含义:某个函数在内部调用自身就称为递归。
常见问题:
死循环‘无限次的重复调用
解决方式,一定要给递归设置合理的结束条件
闭包函数(js高级讲解)
函数类型检测
检测方式:typeof
格式: typeof 函数名;
注意:不要书写小括号
类型名称 ‘function‘
对象
对象是一种复杂数据类型
对象是由一个或多个属性组成的
属性是由属性名和属性值组成的
这种写法又称为 键值对
键 - 属性名 值 - 属性值
var obj = {
name : ‘jack‘,
age : 18,
gender : ‘男‘
};
var obj2 = new Object(); // var obj2 = {}; // 声明了一个空对象
对象的属性操作
对象.属性名
对象['属性名']
// 声明对象同时设置初始属性:
var obj = {
name : 'jack',
age : 18,
gender : '男'
};
// 声明后进行的属性操作:
// 方式1:
console.log( obj.name ); // 'jack'
obj.name = 'rose';
console.log( obj.name ); // 'rose'
// 方式2:
console.log( obj['name'] ); // 'rose'
obj['name'] = '张三';
console.log( obj['name'] ); // '张三'
对象的属性和方法
含义:方法其实也是属性,只是属性值保存的是函数,所以称为方法。
起这个名字的作用:用来区分函数属性和其他普通属性
函数需要进行调用才有意义
设置方式:
可以设置匿名函数
也可以设置命名函数
注意:设置函数名即可,不要加()
// 方法可以设置为匿名函数值:
var obj = {
name : 'jack',
age : 18,
aiHao : ['吃', '喝', '跳广场舞'],
sayHi : function () {
console.log('这是sayHi的代码');
}
};
console.log( obj.name );
console.log( obj.age );
console.log( obj.aiHao );
console.log( obj.sayHi );
obj.sayHi(); */
// 方法也可以设置命名函数:
// - 使用场景:如果多个对象具有相同的方法时,可以采用命名函数统一保存
// 通过命名函数统一保存obj1和obj2的sayHi方法值
function sayHi2 () {
console.log('hello,吃了么~');
}
var obj1 = {
name : 'jack',
// 注意,命名函数设置时,不要加()
sayHi : sayHi2
};
var obj2 = {
name : 'rose',
sayHi : sayHi2
};
obj1.sayHi();
obj2.sayHi();
对象的遍历操作
对象和数组的对比
数组遍历
数组的元素按照索引保存,索引是有序的,所以我们称数组是有序的数据存储方式
采用普通for循环即可遍历
对象遍历
对象的属性按照属性名保存,属性名是无序的,所以我们称对象是无序的数据存储方式
采用for..in循环即可遍历
var obj = {
name : '韩梅梅',
age : 21,
gender : '女'
};
// for (循环变量声明 in 要遍历的对象) {}
for (var key in obj) {
// key 代表属性名,字符串形式,每次循环会自动获取到一个不重复的属性名
// obj[key] 代表属性值
console.log( obj[key] );
}
原文地址:https://www.cnblogs.com/itxcr/p/11600139.html