JS学习总结

  • js学习总结
  • JavaScript
  • 函数
  • 回调函数
  • 作用域
  • 执行上下文
  • 对象
  • 原型和原型链
  • 闭包
  • 感想


js学习总结

学习了一个多星期的JavaScript,遇到不明白的问题,然后去寻求答案,在这个过程中又发现了新的问题,真是amazing。以下是我个人的理解,有不对的地方恳请指正,谢谢!

JavaScript

这是一种脚本语言,由浏览器执行。

函数

JavaScript函数是通过function关键字定义的。

函数也是一个对象,也可以将函数作为对象的属性值,这个时候调用这个函数就叫调用这个对象的方法

我们可以将重复的代码写进函数,使用的时候直接调用函数。

定义一个函数 function fun(){

语句….

return ….

}

fun是函数名,存储在栈内存,他指向函数对象,函数对象存储在堆内存中,使用fun是使用函数本身。

fun()是调用函数,相当于使用函数的返回值,所以return后面的语句不再执行。

回调函数

一个函数A的指针作为另一个函数的参数传递进去,A就是回调函数。

为什么要用回调函数?我也没想明白。

作用域

作用域就是一块“地盘”,在全局作用域里的对象不能访问到函数作用域里的数据(但我们可以通过闭包实现全局访问局部),而函数作用域里的对象能访问到全局里的数据。

作用域分为全局作用域和函数作用域,不管是全局作用域和函数作用域都会有函数提升。在w3school是这样定义的:

“Hoisting 是 JavaScript 将所有声明提升到当前作用域顶部的默认行为(提升到当前脚本或当前函数的顶部)。

定义在全局作用域里的函数是window对象的方法,此时this指得是window。

执行上下文

代码分为全局代码和函数代码。

在全局执行代码之前,js引擎会做一些准备工作。将window设为执行上下文对象,为这个对象添加属性(用var声明的变量)和方法(function声明的全局函数),并将this赋值给window。

在执行全局代码的时候,找一个变量或者函数会在window找。

执行上下文栈:管理执行上下文对象,只有栈顶的执行上下文对象在运行,因为js是单线程运行的。

对于作用域和执行上下文我还存在一些疑惑,为什么要定义这些概念?

对象

js里一切都是对象。对象包含属性和方法,我们可以通过这些属性和方法来完成我们需要的效果。

我们在js里的写的代码代码就是获取对象,然后操作对象。

原型和原型链

每个函数都有一个prototype属性(显式原型),这个属性的默认值是一个空的object对象。

每个实例都有一个__proto__属性(隐式属性),默认值为构造函数的prototype属性值。

他们都是在创建函数或实例的时候自动添加的。

我们需要使用对象的属性或者方法,可以通过隐式属性来查找,然后就形成了原型链,原型链的尽头是object,他的__proto__值是null。

在我们创建对象的属性或方法是直接添加的,不会查找原型链。

闭包

产生闭包的条件:①函数嵌套②内部函数引用了外部函数的数据。

闭包的作用:①使用函数内部的变量在函数执行完毕后,仍然存活在内存里。

②让函数外部可以操作到函数内部的数据。

但是因为函数内的局部变量没有释放,所以就造成内存泄漏(这个变量没有用还占空)。所以使用闭包之后就将指针赋值null;

对于闭包的用处我还不知道。

感想

学习任何一门编程语言都不是一件简单的事情,毕竟计算机只认识0和1,为了使用计算机,我们定义了那么多的深奥的概念理论。大学三年学习了很多理论知识,比如数据结构、操作系统、汇编语言等,但是我都没学明白。通过这些天的学习,我发现我们需要学习的不仅是理论,更需要实践,实践是验证理论的唯一途径。所以,加油呀!!!