高效学习!go!go!go!
1 JS的基本概念
1、借鉴C语言的基本语法
2、借鉴Java语言的数据类型和内存管理
3、借鉴Scheme语言,将函数提升到“第一等公民”(first class)的地位
4、借鉴SELF语言,使用基于原型(prototype)的继承机制
- 单线程
- 动态、弱类型
- 面向对象、函数式
- 解释类语言、JIT
- 安全、性能差
- ······
1.1 数据类型
1.2 作用域
变量的可访问性和可见性
静态作用域,通过它就能够预测代码在执行过程中如何查找标识符
# 全局作用域:
var company = "Bytedance";
function showCompany(){
console.log(company);
}
showCompany()
# 函数作用域
var company = "Bytedance";
function showCompany(){
company = "douyin";
console.log(company);
}
showCompany()
# 块级作用域
{
const company = "Bytedance";
console.log(1, company);
}
consle.log(2, company);
1.3 变量提升
-
var有变量提升
-
let、const没有变量提升,提前访问会报错
-
function函数可以先调用再定义
-
赋值给变量的函数无法提前调用
console.log('company', company); console.log('dep', dep); console.log('myname', myname); showInfo(); shou();
const company = "Bytedance"; let dep = "边缘云"; var myname = "zhangqi";
function showInfo(){ console.log(company, dep, myname); console,log(myname); }
var show = function(){ console.log(myname); }
JS是怎么执行的
const company = "Bytedance";
[
{
"type" :"Keyword" ,"value"; "const"
}.
{
"type": "ldentifier" ."value"; "company"
}.
{
"type": "Punctuator","value"; "=“
}.
{
"type” : "String" .
"value"; "\"Bvtedance\""
}.
{
"type":"Punctuator" ,"value" : ";”
}
]
{
"type":"Program".
"body":[
{
"type" : "VariableDeclaration" .
"declarations": [
{
"type" :"VariableDeclarator” .
"id”:{
"type":“Identifier" .
"name": "company"
}.
"init":{
"type"”:“Literal”.
"value”:"Bytedance" .
"raw":“\ "Bytedance\""
}
}
].
"kind":"const"
}
].
"sourceType": "script"
}
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文( execution context 简称EC ) ”,也叫执行环境
-
全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
-
函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
-
词法环境:基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
-
变量环境:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只用来存储var变量绑定
-
Outer:指向外部变量的一个指针