js基础(2)

断点调试

在网页内按F12进入开发者模式,点击Sources,需要在哪行设置断点,就在那行的行号单击,单击后刷新一下网页,即可进入断点调试。再点击一下行号,取消断点。

数组

创建数组

两种创建数组的方法:1、var Arr=new Array() 2、var arr=[]

数组中可以存放任意类型的数据

1
2
3
4
5
6
7
8
var arr = [1, 2, '王老师', true]
alert(arr)
alert(arr[2])//通过索引访问,从0开始
alert(arr[4])//没有该元素,会返回undefined
for(var i=0;i<arr.length;i++)//arr.length返回数组长度
{
alert(arr[i])
}

新增数组元素

1
2
3
4
5
6
7
var arr = ['red', 'green', 'blue']
alert(arr)
arr.length = 5//通过修改数组长度扩容
alert(arr)//red,green,blue,,
alert(arr[3])//undefined
arr[3]='pink'//这种添加方式和python中的字典很像
alert(arr[3])//pink

课后随便试了一下,好像arr.length的修改并不需要,如下

1
2
3
arr[8] = 'ring'
alert(arr[8])//ring
alert(arr)//red,green,blue,pink,,,,,ring

函数

函数声明

用函数关键字自定义函数

第一种方法,用function声明函数

1
2
3
4
5
6
function add(num1, num2) {
return (num1 + num2)
}
alert(add(1, 2)) //3
alert(add(1, 2, 3)) //3
alert(add(1)) //NaN

从上述结果看,如果实参个数多余形参个数,会按照形参的个数取。如果实参的个数小于形参的个数, 返回NaN。PS:这好像是语言鄙视链的由来之一吧。。。砖家建议:尽量让实参的个数和形参相匹配

return:终止函数,后面的语句都不再执行。只能返回一个值,如果有多个值用逗号隔开,以最后一个值为准。只要是函数,都有返回值。有return,返回return后面的值;没有return,返回undefined

用函数表达式创建函数

1
2
3
4
5
var fun = function(aru) {
alert('我是表达式')
alert(aru)
}
fun('糖醋排骨')

arguments

当我们不确定有多少个参数传递的时候,可以用arguments来获取。来javascript中,arguments实际上是当前函数的一个内置对象。所有函数都内置一个arguments对象,arguments对象中存储了传递的所有实参

arguments展示形式是一个伪数组,因此可以进行遍历

伪数组:具有length、按索引方式存储数据、不具有数组的push、pop等方法

1
2
3
4
5
6
function get_max() {
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i])
}
}
get_max(1, 2, 3, 4, 5)

最后值得注意的一点:只有函数才有arguments

作用域链

1
2
3
4
5
6
7
8
9
10
11
var num = 10
function f1()
{
var num = 20
function f2()
{
alert(num)
}
f2()
}
f1()

学习作用域链前,我们先看下上段代码。这段代码输出的多少呢?答案是20。这就是作用域链的应用。

作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值(就近原则)。这种结构我们成为作用域链

预解析

1
2
alert(num)
var num=10

上面代码在不测试的状态下,你能想到输出什么吗?答案是undefined。那下面这种呢?

1
2
3
4
fn()
function fn() {
alert(10)
}

也能调用该函数。那另一种函数定义的方式呢,如下:

1
2
3
4
fun()
var fun=function(){
alert(22)
}

答案却是无法执行。这又是为什么呢。这就是预解析的作用

JS解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面。代码执行:按照代码书写的顺序从上往下执行

预解析分为变量预解析(变量提升)和函数预解析(函数提升):

​ 变量提升:把所有的变量声明提升到当前的作用域最前面,不提升赋值操作

​ 函数提升:把所有的函数声明提升到当前作用域的最前面,不调用函数

1
2
3
4
5
6
var num = 10
fun()
function fun() {
alert(num)//undefined
var num = 20
}

上段代码相当于执行了下列代码

1
2
3
4
5
6
7
8
var num
function fun(){
var num
alert(num)
num=20
}
num=10
fun()

还有一个经典案例:

1
2
3
4
5
6
7
8
9
10
f1()
alert(c)
alert(b)
alert(a)
function f1(){
var a=b=c=9//坑,相当于var a=9;b=9;c=9;b和c直接赋值,没有var声明,当全局变量看
alert(c)
alert(b)
alert(a)
}

相当于执行以下代码

1
2
3
4
5
6
7
8
9
10
11
function f1(){
var a;
a=b=c=9
alert(a)//9
alert(b)//9
alert(c)//9
}
f1()
alert(a)//9
alert(b)//9
alert(c)//报错
----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%