1.什么是函数?如何创建一个函数?函数就是封装了一段可以重复使用的代码
function 函数名(){ console.log(123)}
2.在函数中有形参和实参,什么是形参?什么是实参?形参就是形式上的参数,它就是在函数名里面的那种参数实参是实际的参数,是传递给形参的数据
function arr(num){ console.log(num)}
console.log( arr(111) )
3.什么是伪数组,它和数组有什么区别?arguments有什么用?伪数组就是很像数组的一个对象伪数组有length属性可以得到伪数组中元素的个数,跟数组一样。伪数组也是通过索引来访问元素的,跟数组一样。数组有一些方法,伪数组不能使用的
每一个函数内部都内置了一个arguments 伪数组,通过arguments访问 调用函数时传递的实参。
学习 = 认知 + 练习 + 反馈

1.在函数中调用其他函数

function fn1() { // 这里是第二句被执行的代码,当fn1被调用的时候,进入fn1函数内部,执行第33行的代码 console.log(111); // 第36行代码去调用了fn2函数,那么就会去执行fn2函数内部的代码,当fn2函数内部代码都执行完了 // 会回到第36行代码,然后继续执行第37行的代码 fn2(); console.log(‘fn1’);}
function fn2() { console.log(222); console.log(‘fn2’);}// 这里是第一句被执行的代码,即调用fn1fn1();

2.声明函数的两种方式

A. 使用function来声明函数function 函数名(){
}函数名()
B. 使用一个变量接收一个匿名函数( 函数表达式 )var 变量名 = function(){
}变量名()

3.作用域

指的就是变量名能够起作用的区域(也就是说你声明的变量可以在哪些区域进行使用)。javascript中分为两种作用域:全局作用域,局部作用域。
全局作用域是一个非常厉害的东西,我们如果声明在全局作用域的变量,可以在js代码的任何地方都能访问到。局部作用域是一个比较小气的东西,我们在局部作用域声明的变量,不能在全局作用域中使用,也不能在另外一个函数中使用,只能在声明的那个函数里面使用。函数的参数也可以认为是一个局部变量。
全局变量和局部变量的区别:全局变量会一直存在,直到关闭浏览器页面为止。局部变量会在调用函数的时候创建出来,当函数调用完毕的时候又被销毁了。

4.作用域链

当我们去访问变量的时候,会现在当前的函数内部查找是否有声明这个变量,如果有就直接使用。如果没有,继续去当前函数的外部查找这个变量,直到找到全局作用域为止。

5.预解析

js解释器执行代码的两个步骤:A.预解析:js解释器会在执行代码之前先将代码 “读” 一遍,找到 var 声明的变量 和function 声明的函数,进行变量提升和函数提升B.执行代码:按照代码书写的顺序,从上到下,一句一句进行执行
预解析要做的事情:A.变量名提升:在预解析的时候,会找到var声明的变量,根据变量名在内存中开辟这个名字对应的空间,相当于就是将变量名的声明代码放在了所有代码的前面。B.函数名提升:在预解析的时候,会找到function声明的函数,只是将函数名称和 函数关联起来了,相当于做完预解析之后,js解释器知道了有一个函数的名字叫什么,不会执行函数。
注意:当我们进行变量初始化的时候,会进行变量名提升,但是不会做赋值操作,赋值操作会在第二个阶段(执行代码)进行操作var num = 123;// 预解析的时候会在内存中开辟一个num的空间。// 代码执行的阶段会将数据123保存到num空间中。
注意:函数名提升:预解析的时候,会解析到fn函数,解析完成之后,js解释器就知道当前作用域中有一个fn函数。执行代码的时候,如果遇到了fn() 调用,就会找到fn函数,进行执行function fn(){
}
如果是一个函数表达式,他是不是进行函数名提升的。foo();// 在赋值函数之前 ,foo只是一个变量,里面没有数据,没有办法进行调用。var foo = function(){
}foo();// 执行完了函数的赋值操作之后,foo就是一个函数了,可以进行正常调用。

6.对象

在现实世界中,对象是一个具体存在的事物,不是泛指的一类内容。在编程世界中,对象是一种数据类型,它可以用来保存属性和方法。属性就是对象的一些基本信息,方法是对象可以去做的事情。
万物皆为对象。

7.创建一个对象

对象的字面量是{ } ,我们可以在{ } 去写属性或者方法,对象中的属性和方法是以键值对的形式来编写的。 键 : 值对象中的键名也被称为属性名。var obj = { name:”jack”, age:20, run:function(){
}}
对象中的每个键值对用逗号隔开的,方法的值一定是一个匿名函数。
如果想要访问对象中的信息,或者方法。A.访问对象的属性,可以使用点语法: obj.name 还可以使用关联语法: obj[ ‘age’ ]B.访问对象的方法必须使用 () 进行调用: obj.run()
补充:独立声明的function,被称为是函数。写在对象里面的function,叫他是方法
创建可可:var dog = { name:”可可”, type:”阿拉斯加犬”, age:5, color:”棕红色”, bark:function(){ console.log(‘汪汪汪’) }, showFilm:function(){ console.log(‘拍电影’) }}
dog.bark()

8.创建对象的第二种方式

// 创建了一个obj的空对象 ( 所谓的空对象就是没有属性也没有方法的对象,就是空对象 )var obj = new Object();
// 通过js代码的形式为对象添加属性和方法// 给obj对象添加name属性,name属性的值为roseobj.name = ‘rose’obj.run = function(){
}

9.构造函数

我们可以使用构造函数来批量的创建属性和方法一致的对象。封装了对象的需要属性或方法,当我们使用构造函数的时候,就可以创建一个对象了。
构造函数的语法结构:function 构造函数名(形参1,形参2….形参N){ // 在构造函数中的this就是 新创建的那个对象 this.属性名 = 值 this.方法名 = function(){ }}//调用构造函数,obj就是构造函数创建出来的新对象。var obj = new 构造函数名(实参….)
注意:1.构造函数的函数名首字母必须要大写2.构造函数必须使用new关键字进行调用。3.构造函数内部不要写return语句,构造函数默认就会返回创建的一个新对象。4.使用构造函数创建对象的过程也被称为 实例化对象 的过程.5.使用构造函数创建出来的对象,也被称为 实例对象

10.new关键字调用构造函数的时候的执行过程。

A.创建一个空的对象B.使用this指向这个空对象。// this = { }C.通过this给这个空对象添加属性或者方法D.将设置好了属性或者方法的对象作为构造函数的结果返回。

11.遍历对象的方式

var obj = { name:’jack’, age:10}
for(var k in obj){ // 变量k得到的是obj对象中的属性名(键名) console.log(k);// 打印的是name,age
console.log( obj[ k ] );// 打印的是属性对应的值,jack,10}
回顾一下数据类型:简单数据类型:Number,String,Boolean,Null,undefined复杂数据类型:Array,Object
对象就是一组无序的属性和方法的集合。数组就是一组有序的数据的集合。

12.内置对象

javascript为了方便开发,提供了一些内置对象,这些内置对象有一些属性和方法我们可以直接拿来使用。内置对象:Math,Date,Array,String。
Math.PI: 获取圆周率Math.max() :求得一组数字最大值。Math.abs() :求数字的绝对值Math.floor() : 对数字进行向下取整 Math.ceil() :对数字向上取整Math.round() :对数字进行四舍五入取整。Math.random() : 随机获取最小为0,最大不超过1的小数数字。// 运用Math.random方法取得一个随机的整数数字,可以通过min,max参数来设置数字的最小值和最大值。function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min;}