断点调试
在网页内按F12进入开发者模式,点击Sources,需要在哪行设置断点,就在那行的行号单击,单击后刷新一下网页,即可进入断点调试。再点击一下行号,取消断点。
数组
创建数组
两种创建数组的方法:1、var Arr=new Array() 2、var arr=[]
数组中可以存放任意类型的数据
1 | var arr = [1, 2, '王老师', true] |
新增数组元素
1 | var arr = ['red', 'green', 'blue'] |
课后随便试了一下,好像arr.length的修改并不需要,如下
1 | arr[8] = 'ring' |
函数
函数声明
用函数关键字自定义函数
第一种方法,用function声明函数
1 | function add(num1, num2) { |
从上述结果看,如果实参个数多余形参个数,会按照形参的个数取。如果实参的个数小于形参的个数, 返回NaN。PS:这好像是语言鄙视链的由来之一吧。。。砖家建议:尽量让实参的个数和形参相匹配
return:终止函数,后面的语句都不再执行。只能返回一个值,如果有多个值用逗号隔开,以最后一个值为准。只要是函数,都有返回值。有return,返回return后面的值;没有return,返回undefined
用函数表达式创建函数
1 | var fun = function(aru) { |
arguments
当我们不确定有多少个参数传递的时候,可以用arguments来获取。来javascript中,arguments实际上是当前函数的一个内置对象。所有函数都内置一个arguments对象,arguments对象中存储了传递的所有实参
arguments展示形式是一个伪数组,因此可以进行遍历
伪数组:具有length、按索引方式存储数据、不具有数组的push、pop等方法
1 | function get_max() { |
最后值得注意的一点:只有函数才有arguments
作用域链
1 | var num = 10 |
学习作用域链前,我们先看下上段代码。这段代码输出的多少呢?答案是20。这就是作用域链的应用。
作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值(就近原则)。这种结构我们成为作用域链
预解析
1 | alert(num) |
上面代码在不测试的状态下,你能想到输出什么吗?答案是undefined。那下面这种呢?
1 | fn() |
也能调用该函数。那另一种函数定义的方式呢,如下:
1 | fun() |
答案却是无法执行。这又是为什么呢。这就是预解析的作用
JS解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面。代码执行:按照代码书写的顺序从上往下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升):
变量提升:把所有的变量声明提升到当前的作用域最前面,不提升赋值操作
函数提升:把所有的函数声明提升到当前作用域的最前面,不调用函数
1 | var num = 10 |
上段代码相当于执行了下列代码
1 | var num |
还有一个经典案例:
1 | f1() |
相当于执行以下代码
1 | function f1(){ |