function函数

需要注意的是JavaScript中的函数也是一个对象,所以函数也是在堆中保存的 JavaScript中的函数可以分为系统函数和自定义函数。 每个类型又分为:

a.不带参数的函数 b.带参数的函数 c.无返回值的函数 d.有返回值的函数

<mark>系统函数</mark>

1.概念:js的内置函数,可以直接拿来使用 2.要素:函数名称,参数,返回值 3.调用方式:使用函数名,并传参给函数,可以在任意地方使用系统函数 4.调用结果:函数返回值

<mark>自定义函数</mark>

1.概念:在很多时候,我们需要自己去创建一些特定功能的函数,叫自定义函数。 2.要素:

a.声明:用function这个关键字来声明函数 b.函数名称:英文开头的字符串。后面要有小括号 c.参数:若有,在小括号中用:逗号隔开。JavaScript中所有的参数传递都是按值传递的 d.函数体:用大括号:括起来 e.返回值:在函数体中,使用return返回。并且,return后不执行其他代码。

//函数声明的第二种方式,声明式函数
function a(x)//小括号内是参数
{
    return x*x;//两个大括号内是要执行的代码
}
//函数声明的第二种方式,赋值式函数
var a=function (x)
	{
		return x*x;
	}

由于存在函数声明提升的过程,第一种方式在函数声明之前就可以调用函数,而第二种不行。

垃圾回收

-不能使用的对象的内存将会自动回收,这种功能称做垃圾回收。 -所谓不再使用的对象,指的是没有被任何一个属性(变量)引用的对象。 -垃圾回收的目的是,使开发者不必为对象的生命周期管理花费太多的精力。

预解析

  • 预解析 其实就是聊聊 js 代码的编译和执行
  • js 是一个解释型语言,就是在代码执行之前,先对代码进行通读和解释,然后再执行代码
  • 也就是说,我们的 js 代码在运行的时候,会经历两个环节 解释代码执行代码

解释代码

  • 因为是在所有代码执行之前进行解释,所以叫做 预解析(预解释) 需要解释的内容有两个 1.声明式函数:在内存中先声明有一个变量名是函数名,并且这个名字代表的内容是一个函数 2.var 关键字:在内存中先声明有一个变量名 看下面一段代码:
fn()
console.log(num)

function fn() {
  console.log('我是 fn 函数')
}

var num = 100

经过预解析之后可以变形为

function fn() {
  console.log('我是 fn 函数')
}
var num

fn()
console.log(num)
num = 100
  • 赋值式函数会按照 var 关键字的规则进行预解析

作用域

  • 什么是作用域,就是一个变量可以生效的范围
  • 变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域

<mark>全局作用域</mark>

  • 全局作用域是最大的作用域
  • 在全局作用域中定义的变量可以在任何地方使用
  • 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window
  • 这个作用域会一直存在,直到页面关闭就销毁了
// 下面两个变量都是存在在全局作用域下面的,都是可以在任意地方使用的
var num = 100
var num2 = 200

<mark>局部作用域</mark>

  • 局部作用域就是在全局作用域下面有开辟出来的一个相对小一些的作用域
  • 在局部作用域中定义的变量只能在这个局部作用域内部使用
  • 在 JS 中只有函数能生成一个局部作用域,别的都不行
  • 每一个函数,都是一个局部作用域
// 这个 num 是一个全局作用域下的变量 在任何地方都可以使用
var num = 100

function fn() {
  // 下面这个变量就是一个 fn 局部作用域内部的变量
  // 只能在 fn 函数内部使用
  var num2 = 200
}

fn()

函数也可以作为参数

-函数也是一个对象,所以函数和其他对象一样也可以作为一个参数传递给另外一个函数。 -但是要注意的是使用函数作为参数时,变量后面千万不要加(),不加()表示将函数本身作为参数,加上以后表示将函数执行的结果作为参数。

JavaScript中的对象

对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。 ###<mark>对象的分类:</mark> 1)内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用。比如:Math,Number,Boolean,Function,Object... 2)宿主对象:由JS运行环境提供的对象,目前来讲主要指浏览器提供的对象。比如BOM,DOM(它们是指两组对象,而不是两个对象BOM是Browser Object Mode的缩写,即浏览器对象模型,用来获取或设置浏览器的属性、行为。DOM是Document Object Model 的缩写,即文档对象模型,用来获取或设置文档中标签的属性。 3)自建对象:由开发人员自己创建的对象。

###<mark>对象的基本操作:</mark>

<script>
	var obj=new Object();//创建一个对象(第一种方式)
	obj.name="Acapplella";//向对象obj中增加一个属性obj.name
	obj.name="Good!";//修改obj.name的值
	//访问对象的属性直接用对象名.属性名就可以了
	document.write(obj.name);
	delete obj.name;//删除obj.name
        var oj={//创建一个对象的第二种方式
                  name='Acapplella';
                  age='18';
                }
</script>

###<mark>对象属性访问的两种方式:</mark> 1.对象.属性名 2.对象['属性名']

##this(上下文对象)

  • 我们每次调用函数时,解析器都会将一个上下文对象作为隐含的参数传递进函数。
  • 使用this来引用上下文对象,根据函数的调用形式不同,this的值也不同。
  • <mark>this的不同的情况:</mark> 1.以函数的形式调用时,this是window 2.以方法的形式调用时,this就是调用方法的对象 3.以构造函数的形式调用时,this就是新创建的对象

构造函数

-构造函数是专门用来创建对象的函数 -一个构造函数我们也可以称为一个类 -通过一个构造函数创建的对象,我们称该对象时这个构造函数的实例 -通过同一个构造函数创建的对象,我们称为一类对象 -构造函数就是一个普通的函数,只是他的调用方式不同, 1.如果直接调用,它就是一个普通函数 2.如果使用new来调用,则它就是一个构造函数

eg:

function Person(){
		
		}

-构造函数的执行流程: 1.创建一个新的对象 2.将新的对象作为函数的上下文对象(this) 3.执行函数中的代码 4.将新建的对象返回

-instanceof 用来检查一个对象是否是一个类的实例 1.语法:对象 instanceof 构造函数 2.如果该对象时构造函数的实例,则返回true,否则返回false 3.Object是所有对象的祖先,所以任何对象和Object做instanceof都会返回true

###枚举对象中的属性

		for...in
		语法:
			for(var 属性名 in 对象){
			
			}

for...in语句的循环体会执行多次,对象中有几个属性就会执行几次, 每次讲一个属性名赋值给我们定义的变量,我们可以通过它来获取对象中的属性