07js-函数相关概念/作用域/预解析/欲解析分段问题

函数

/**
	 *函数:把一坨重复的代码进行封装 在需要的时候拿出来
	 *函数作用:代码的重用
	 *
	 *函数的参数:
	 *1、形参:函数定义的时候 函数名字后面的小括号里面的变量
	 *2、实参:函数调用的时候 函数名字后面的小括号里的变量或者值
	 *
	 *返回值:
	 *函数中有return  函数有返回值
	 *函数中没有return 函数没有返回值
	 *没明确返回值:函数中没有return或者return后面没有任何内容如果一个函数没有明确的返回值 接收这个函数 结果是undefined
	 *
	 *有参数有返回值的函数
	 *无参数无返回值的函数
	 *无参数有返回值的函数
	 *有参数无返回值的函数
	 *
	 *arguments--------------->获取函数调用的时候 传入的实参的个数
	 *arguments是一个伪数组 是一个对象
	 *arguments.length------>是实参的个数
	 *arguments[索引]------->实参的值
	 *
	 *
	 *作用域:变量的使用范围
	 *全局作用域:全局变量在任何位置都可以使用的范围
	 *局部作用域:局部变量只能在某个地方使用----函数内
	 *作用链:在一个函数中使用一个变量 先在该函数中搜索这个变量 找到了则使用 找不到则继续向外面找这个变量 找到则使用 一直找到全局作用域 找不到则是undefined
	 *全局变量:只要在函数外面声明的变量都可以看成或者理解成是全局变量
	 *局部变量:在函数中定义的变量
	 *
	 *预解析:在代码之前做的事情
	 *变量的声明和函数的声明被提前了 变量和函数的声明会提升到当前所在的作用域的最上面
	 *函数中的变量声明 会提升到该函数的作用域的最上面(里面)
	 *如果有多对script标签都有相同名字的函数 预解析的时候是分段的 互不影响
	 *
	 参数对象:参数对象的使用场景只是在调用函数时传入实参的数量不确定的情况下
	 那么我们就会把形参去掉用参数对象arguments来代替。
	 参数对象的本质是一个类数组,拥有数组下标的特性和.length特性。
	 */


作用域

//作用域:变量的使用范围
	/**
	 *
	 *全局变量:声明的变量是使用var声明的 那么这个变量就是全局变量 全局变量可以在页面的任何位置使用 
	 *局部变量:在函数内部定义的变量 是局部变量 外面不能使用 
	 *全局变量 如果页面不关闭 那么就不会被释放 就会占空间 消耗内存
	 *
	 *
	 *全局作用域:全局变量的使用范围
	 *局部作用域:局部变量的使用范围
	 *
	 * 
	 *块级作用域:一对大括号就可以看成是一块 在这个块区域中定义的变量 只能在这个区域中使用 但是 js中在这个块级作用域中定义的变量 外面也可以使用
	 *说明:js没有块级作用域 只有函数除外
	 *
	 *隐式全局变量:声明的变量没有var 就叫隐式全局变量
	 *全局变量是不能被删除的 隐式全局变量是可以被删除的
	 *定义变量使用var 是不会被删除的 没有var是可以删除的
	 * 
	 */
function f1() {
		number = 1000;//隐式全局变量
	}
	f1();
	console.log(number);

	// var num1 = 10;
	// num2 = 20;
	// delete num1;//把num1删除
	// delete num2;//把num2删除
	// console.log(typeof num1);//number
	// console.log(num1+10);//20
	// console.log(typeof num2);//undefined

	//扩展:隐式
   //    function f1() {
		 //  var num = 100;
		 //  num += 10;
	  // }
	  // f1();//这个函数结束之后

	  // {
	  // 	var num = 10;
	  // 	console.log(num);//10
	  // }
	  // console.log(num);
	 

	 // if (true) {
	 // 	var num = 10;
	 // }
	 // console.log(num);//10

	 // for (var i = 0; i < 5; i++) {
	 // 	var number = 20;
	 // }
	 // console.log(number);//20


	 // var i = 0;
	 // while(i<5){
	 // 	var num = 100;
	 // 	i++;
	 // }
	 // console.log(num);//100

	 // function f1() {
	 // 	var num = 10;
	 // }
	 // f1();
	 // console.log(num);//100

	 // var num = 10;
	 // console.log(num);//10

预解析

//预解析:提前解析代码
		
		/**
		 *预解析: 就是在解析代码之前
		 *预解析做什么事情?
		 *把变量的声明提前了------提前到当前所在的作用域的最上面
		 *函数的声明也会被提前-----提前到当前所在的作用域的最上面
		 *
		 *
		 * 
		 */
		//函数在调用的时候 会把函数的声明提升到作用域的最上面
		 // f1();//调用
		 // var num = 20;//把这个变量的声明会提升到变量使用之前
		 // function f1() {
		 // 	console.log(num);
		 // }

		 // function f1() {
		 // 	console.log("今天外面好吵");
		 // }
		 // f1();
		 // function f1() {
		 // 	console.log("这是f1啊啊啊");
		 // }
		 // f1();


		 //把变量的声明提前了
		 var num;
		 console.log(num);//undefined
		 num = 10;
		 function f1() {
		 	console.log("哈哈 这是f1啊啊啊啊");
		 }
		 f1();

欲解析分段

<body>
	<script>
	//预解析中 变量的提升 只会在当前的作用域中提升 提前到当前的作用域的最上面
	//函数中的变量只会提前到函数的作用域中的最前面 不会出去
	//预解析会分段(多对script标签中函数重名 预解析的时候不会冲突)
		function f1() {
			console.log(num);//undefined
			var num = 10;
		}
		f1();
		console.log(num);


		function f1() {
			console.log("哈哈哈");
		}
	</script>
	<script>
		f1();
		function f1() {
			console.log("嘎嘎");
		}

	</script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值