JavaScript核心概念学习

执行上下文与作用域链

执行上下文(简称为上下文)决定 了JS执行过程中可以获得哪些变量、函数、数据,一段程序可能被分割成许多不同的上下文,每一个上下文都会绑定一个变量对象,它就像一个容器,用来存当前上下文所有已定义或可获取的变量、函数等,位于最顶部或最外层的上下文称为全局上下文,全局上下文在浏览器里由window代理,在nodejs里是global。

需要注意的是,上下文和作用域(scope)是不同的概念,JS本身是单线程 的,每当有function被执行时,就会产生一个新的上下文,这一上下文会被压入JS的上下文堆栈中,function执行结束后则被弹出,因此JS解释器总是在栈顶上下文中执行,在生成新的上下文时,首先会绑定该上下文的变量对象,其中包括arguments和这个函数中定义的变量,之后会创建属于这个上下文的作用域链,最后把this赋给这一function所属的对象。

在function被执行时生成新的上下文时会先绑定当前上下文的变量对象,再创建作用域链,我们知道function的定义是可以嵌套在其他function所创建的上下文中,也可以并列地定义在同一个上下文中,作用域链实际上就是自下而上的将所有嵌套定义的上下文所绑定的变量对象串接在一起,使嵌套的function可以嵌套上层上下文的变量,而并列的function之间互不干扰。

闭包

如果理解了上文中提到的上下文与作用域链的机制,再来看闭包的概念就很清楚了,每个function在调用时会创建新的上下文及作用域链,而作用域链就是将外层上下文所绑定的变量对象逐一串连起来,使当前的function可以获取外层上下文的变量、数据等。如果我们在function中定义新的function,同时将内层function作为值返回,那么内层function所包含的作用域将会一起返回,即使内层function在其他上下文中执行,其内部的作用域链仍然保持原有的数据,而当前的上下文可能无法获取原生外层function中的数据,使用function内部的作用域被,从而形成闭包。

我们知道,在JS中一切都是对象(Objet),但是js中并没有类,js是基于原型,但并不是所有的对象都拥有prototype这个属性:

var a = {};
console.log(a.prototype);//undefined

var b = function(){};
console.log(b.prototype); // => {}

var c = "hello";
console.log(c.prototype); //undefined
时间: 2024-10-10 01:19:13

JavaScript核心概念学习的相关文章

最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructuring 箭头函数 Arrow Functions Symbols 集合 学习Babel和Broccoli,马上就用ES6 代理 Proxies ES6 说自己的宗旨是"凡是新加入的特性,势必已在其它语言中得到强有力的实用性证明."--TRUE!如果你大概浏览下 ES6 的新特性,事实上它

javascript 核心语言笔记 6 - 对象

对象是 JavaScript 的基本数据类型.是一种复合值:将很多值聚合在一起.对象可以看做是无序集合,每个属性都是一个名/值对.这种基本数据结构还有很多叫法,比如「散列」(hash).「散列表」(hashtable).「字典」(dictionary).「关联数组」(associative array).JavaScript 还可以从一个称为 原型 的对象继承属性 JavaScript 对象是动态的 -- 可以新增属性也可以删除属性,除了字符串.数字.布尔值.null 和 undefined 之

javascript 核心语言笔记 5 - 语句

表达式在 JavaScript 中是短语(phrases),那么语句(statements)就是 JavaScript 整句或命令,语句以分号结束.表达式计算出一个值,语句用来执行以使某件事情发生 表达式语句 赋值语句.递增/减运算.delete 运算符删除对象属性.函数调用都是表达式语句 1 gretting = "Hello " + name; 2 i *= 3; 3 count++; 4 delete o.x; 5 alert(greeting) 6 window.close()

《JavaScript核心概念及实践》-- 读书笔记

前言: 程序设计语言主要分为两种  1.基于存储原理(冯*诺依曼体系)的命令式编程语言,如C/C++.Java.Object Pascal(DELPHI).                              2.根据阿隆左*丘琦的lambda演算而产生的函数式编程语言,如Lisp.Scheme.                              这两种语言互不干涉的时代(javascript出现以前),程序=数据结构+算法                            

《JavaScript权威指南》读书笔记——JavaScript核心

前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的“犀牛书”,算是JS界公认的“圣经”了.本书较厚(有1004页),读起来颇费功夫,但作为JavaScript(下文简称:JS)相关从业者,我还是鼎力推荐,一定要读完这本经久不息,好评如潮的JS“圣经”(如果您有耐心的读完,觉得还不错的,博客最后附有购买本书的优惠券,可自行领取). 说完本书重要性,下面重点介绍一下本书作者写书的逻辑性,简单来说本书分为四部分,第一部分:JS核心:第

javascript 核心语言笔记- 2 语法结构

字符集 JavasSript 程序是用 Unicode 字符集 编写的,Unicode 是 ASCII 和 Latin-1 的超集,支持几乎所有在用的语言.ECMAScript 3 要求 JavaScript 的实现必须支持 Unicode 2.1 及后续版本,ECMAScript 5 则要求支持 Unicode 3 及其以后的版本 区分大小写 JavaScript 是区分大小写的.关键字.变量.函数名和所有的标识符(identifier)都必须采取一致的大小写形式 需要注意的是 HTML, H

JavaScript核心-继承-原型链

继承是面向对象的编程的一大特性,很多OO语言都支持两种继承方式:接口继承和实现继承.在ECMAScript中,由于函数没有签名,所以无法实现接口继承,只有实现继承. 实现继承主要是依靠原型链来实现的. 简单回顾一下构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而对象的每个实例都有一个指向原型对象的内部指针. 再回顾一下原型对象的用途:用途是包含可以由特定类型的所有实例共享的属性和方法. 原型对象也是一个简单的对象,如果我们让一个原型对象等于另一个

JavaScript核心基础语法

一. javascript 添加到 html 中的方式: 1. 外部方式:   将<script>内容代码</script>写在一个新建的javascript的文件中,然后在html文件中引入,引入方式是在head中添加:   <script type="text/javascript" src="javascript的文件路径"></script> 2. 内联方式:   将javascript脚本代码包含在html事

JavaScript核心

一.将JS添加到HTML文档中 (一)使用<script>元素 <head> <title></title> <script type="text/javascript"> /*js代码*/ </script> </head> (二)连接外部脚本 <script type="text/javascript" src="js/test01.js" > &