Web前端105天-day21-JS

js06

目录

前言

一、函数

1.1创建函数的方式

1.2面试题:如果变量名与函数名重复,该如何提升?

1.3全局污染与解决方案

1.4回调函数

二、系统函数

三、Sass

总结


前言

day21-js06学习开始


一、函数

1.1创建函数的方式

函数声明:
function fn(){
  函数体
}
函数表达式:--把匿名函数赋值给变量,变量名称就是函数的名称
var fun = function(){
   函数体
}
  • 注意:以上两种写法是等价的!

1.2面试题:如果变量名与函数名重复,该如何提升?

  • 正常情况下,函数(整体)先提升,变量(声明)再提升
  • 函数名称与变量名称相同时,函数提升后,变量声明就不再提升了
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>函数面试题</title>
	</head>
	<body>
		<script>
			//正常情况下,函数(整体)先提升,变量(声明)再提升
			/* b()//1
			console.log(a)//undefined
			var a = 2
			function b(){
				console.log(1)
			} */
			
			//思考:如果变量名与函数名重复,该如何提升?
			// 第一步提升函数:c = function c()
			// 第二步:由于变量c与已提升的函数同名了,所以不提升
			// 第三步:重新赋值c = 2
			var c = 2
			function c(){
				console.log(666)
			}
			c()//因为变量c的值被覆盖成了数值2
			//不能被当做函数调用TypeError: c is not a function
		</script>
	</body>
</html>

1.3全局污染与解决方案

  • 全局污染:全局变量在不同位置出现了同名,进而带来值相互影响的效果
  • 全局作用域:在html中script标签下与每一个外部的JS文件,都在全局作用域之下
  • 解决全局污染:匿名函数自调用
;(function() {
    在函数作用域下的内容都属于局部内容	
})()
; 在匿名函数自调用前加分号,结束上一行,就可以防止和上一行代码连到一起执行
()前面的小括号把匿名函数包裹,表示这是一个整体
()后面的小括号表示要调用当前的这个匿名函数
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>匿名函数调用</title>
	</head>
	<body>
		<button id="btn1">按钮1</button><span id="cont1"></span>
		<hr>
		<button id="btn2">按钮2</button><span id="cont2"></span>
		<hr>
		<button id="btn3">按钮3</button><span id="cont3"></span>
		<script>
			//全局污染:
			//全局生效的多个同名变量,值会互相影响
			//方案1:尽量做到所有变量名不重复--不可能
			//方案2:放到普通函数中-函数名也是名,还会发生冲突污染的问题--不推荐
			//方案3:放在匿名函数中--即是局部作用域,又没有名字

			//全局污染解决方案:匿名函数自调用
			//格式:先用一对小括号把匿名函数整体包裹起来,表示这是一个整体
			//再在后面跟一对小括号,表示要调用前面的这个匿名函数
			//(function(){被包裹的变量与函数})()
			;(function() {
				var a = 1
				btn1.onclick = function() {
					cont1.innerHTML = ++a
				}
			})()

			;(function() {
				var a = 2
				btn2.onclick = function() {
					cont2.innerHTML = ++a
				}
			})()

			;(function() {
				var a = 4
				btn3.onclick = function() {
					cont3.innerHTML = ++a
				}
			})()
			
			//var a = 1
			//如果后面的内容以括号开头,上下两行默认会连到一起执行
			//为了防止和上一行代码连接到一起,要在匿名函数自调用前加分号结束上一行
			// ;(function fn(){
			// 	console.log(fn)
			// })()
			//console.log(fn())//fn()局部函数,只能在内部访问
			//console.log(fn)//fn数据局部函数的名字也是一个局部变量,只能在内部访问
		</script>
	</body>
</html>

1.4回调函数

  • 函数可以传的值:
    • fn(77) 函数的实参可以是数值类型

    • fn(‘hello world’) 函数的实参可以是字符串类型

    • fn(false) 函数的实参可以是布尔类型

  • 前面我们讲过,函数function也是一种数据类型,那函数可以作为实参传递给别的函数吗?
    • 可以。函数的实参可以是函数类型,分为两种:

    • fn(匿名函数)

    • fn(函数名称)—普通的函数直接传函数的名称就可以

  • 回调函数的概念:
    • 就是把一个函数类型的值作为参数传递,被传递的函数就称作回调函数
    • 回调函数会自动调用

  • 回调函数的格式:​​​​​
function xin(madai){
   madai() //调用传递进来的函数,传谁调用谁
}
function ming(){ … }
xin(ming) //普通函数直接传函数名
xin(function(){…}) //匿名函数传递的是全部内容
  • 获取函数调用后结果的两种方式:

    • 通过返回值 return 返回函数执行的结果
    • 通过回调函数,把值放到回调函数的参数中

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>回调函数</title>
	</head>
	<body>
		<script>
			
			function xin(madai){//用于接收调用函数时传递过来的实参
				console.log('新哥开始跑第1棒')
				console.log('新哥到达第1棒终点')
				//console.log(madai)//打印的是传递过来的函数整体
				//相当于:madai=ming
				madai()//相当于ming()
			}
			function ming(){
				console.log('铭哥开始跑第2棒')
				console.log('铭哥到达第2棒终点')
			}
			function liang(){
				console.log('亮哥开始跑第2棒')
				console.log('亮哥到达第2棒终点')
			}
			//调用时,传递的是函数名,没有小括号!
			xin(ming)//小新老师带着小铭老师跑
			xin(liang)//小新老师带着亮哥跑
			
			//换成匿名函数--新哥的麻袋要装个陌生人跑接力赛
			//调用时,传递的是匿名函数的全部内容
			xin(function(){
				console.log('陌生人被新哥套麻袋里疯狂跑')
			})
		</script>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>回调函数练习</title>
	</head>
	<body>
		<script>
			//练习:创建函数getSum,传递任意一个数字,返回1~任意数字之间所有整数的和
			/* function getSum(n) {
				for (var i = 1, sum = 0; i <= n; i++) {
					sum += i
				}
				return sum //通过返回值来获取最终结果
			}
			console.log(getSum(100)) */

			function getSum(n, cb) {
				for (var i = 1, sum = 0; i <= n; i++) {
					sum += i
				}
				//cb就相当于是我们调用getSum()是传递进来的匿名函数
				cb(sum) //调用匿名函数,并将累加结果sum传递给下面匿名函数的形参r
			}
			//变量r用来接收调用回调函数时传入的sum变量的值
			getSum(10, function(r) {
				console.log(r)
			})

			//创建函数getCount,传递任意两个数字,查看两者之间闰年的数量
			//要求:使用回调函数获取结果
			function getCount(n1, n2, cb) {
				//循环从n1~n2之间所有的年份
				for (var i = n1, count = 0; i <= n2; i++) {
					//判断当前循环到的年份是否是闰年
					if(i%4===0 && i%100!==0 || i%400===0){
						//是闰年,闰年的总数+1
						count++
					}
				}
				//调用传递进来的回调函数,并且将count的值作为参数传出
				cb(count)
			}
			//res用来保存回调函数被调用时传入的参数值count
			getCount(2000,2100,function(res){
				console.log(res)
			})
		</script>
	</body>
</html>

二、系统函数

  • isNaN() 用来检测用户输入的值是否含有非数字

  • 如果有->true  如果没有->false
//系统函数:JS提供的函数
//检测输入的值是否含有非数字
console.log(isNaN('1a'))//true
console.log(isNaN('a'))//true
console.log(isNaN(NaN))//true
console.log(isNaN(undefined))//true
console.log(isNaN(null))//false
console.log(isNaN(true))//false
console.log(isNaN(false))//false
console.log(isNaN(666))//false
  • 更多函数将在js高级学习

三、Sass

​
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>sass初体验</title>
		<link rel="stylesheet" href="../scss/01.css">
	</head>
	<body>
		<!-- mydiv宽度250px,背景为浅蓝色
		 图片变块级,且占父级宽度的100%-->
		<div class="mydiv">
			<img src="假装有图片" alt="">
			<h3>标题18px</h3>
			<p>字体12px 红色字</p>
		</div>
	</body>
</html>

​
  • 安装sass插件,详情见day15-BOOT
/* body {
	background-color: #fff;
} */
// p { font-size: 18px}
// 01.sass
.mydiv {
	width: 250px;
	background-color: lightblue;
	img {
		display: block;
		width: 100%;
	}
	h3 {font-size: 18px}
	p {
		font-size: 12px;
		color:red;
	}
}
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试变量</title>
		<link rel="stylesheet" href="../scss/02_var.css">
	</head>
	<body>
		<div class="box"></div>
		<h2>我是一个测试标题</h2>
		<button>测试按钮</button>
	</body>
</html>
// 02.scss

$a:400px;
$b:center;
$c:#fff;
$shadow:5px 7px 5px rgba(0,0,0,.5);
// $red:#DB221D;
$red:#0aa1ed;
.box {
	width: $a;
	height: $a;
	text-align: $b;
	background-color: $red;
	color:$red;
	//border-color: $hello;
	$hello:green;
	border-color: $hello;
	box-shadow: $shadow;
}
h2 {
	//background-color: $hello;
	background-color: $red;
}
button {
	background-color: $red;
}

以上就是SASS的简单语法,更多内容将在实战中练习。


总结

da21-js06学习结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值