JavaScript基础(五)

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] );
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值