#JS简单总结
##1.JS简介
JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。维基
###通常完整的JavaScript由以下几部分组成
- ECMAScript
- 文档对象模型(DOM)
- 浏览器对象模型(BOM)
###JavaScript常用来完成以下任务:
- 嵌入动态文本于HTML页面
- 对浏览器事件作出响应
- 读写HTML元素
- 在数据被提交到服务器之前验证数据
- 检测访客的浏览器信息
- 控制cookies,包括创建和修改等
##2.引用方式
###1)行间式
<div id="one"onload="one.style.backgroundColor='#fff'">
</div>
###2)内联式 页面< script > 标签
<script>
</script>
###3)外联式
<script src="myScript.js"></script>
##3.基本语法
var x, y; // 如何声明变量
x = 7; y = 8; // 如何赋值
z = x + y; // 如何计算值
###JavaScript 注释
双斜杠 // 或 /* 与 */ 之间的代码被视为注释。
var x = 7; // 会执行
// var x = 8; 不会执行
###JavaScript 对大小写敏感
所有 JavaScript 标识符对大小写敏感。区分大小写
###标识符与关键字
var a = 110; // var 关键字 a变量名标识符
##4.数据类型
###1)基本数据类型(数据存储在栈区)
- 数值型
JavaScript不区分整型和浮点型,就只有一种数字类型。JavaScript 只有一种数值类型,写数值时用不用小数点均可,超大或超小的数值可以用科学计数法来写。
var a = 1.1;
var b = 2;
var c = 233e5; // 13300000
var d = 123e-5; // 0.001
- 布尔值型
布尔值只有两个值:true 或 false。
var x = true;
var y = false;
- 字符串型
字符串是一串字符,字符串被引号包围,可使用单引号或双引号。
var hello = "hello world"; // 使用双引号
var hello = 'hello world'; // 使用单引号
- Undefined
在 JavaScript 中,没有值的变量,其值是 undefined。typeof 也返回 undefined。
var a; // 值是 undefined,类型是 undefined
- Null
在 JavaScript 中,null 是 “nothing”。它被看做不存在的事物,表示空。可以通过设置值为 null 清空对象。
var a = null;// 值是 null,但是类型仍然是对象
###2)引用数据类型(数据存储在堆区)
- 数组
JavaScript 数组用方括号书写,数组的项目由逗号分隔。
var arr = [one", "two", "three"];
- 对象
JavaScript 对象用花括号来书写。对象属性是 name:value 对,由逗号分隔。
var arr = ["a","b","c"];
- 函数
function var f = function (){ var i=0; var j=1;}
##5.JS代码在执行时的两个阶段
###JS代码在执行时分两个阶段:
- 预编译
- 代码执行
每一个阶段做的事情是不一样的。
定义变量和声明变量:
定义变量:var a = 110; 定义 = 声明+赋值
声明变量:var a = 110; 说的声明仅仅是说var a 后面是赋值
预编译: 提升
把加var的变量进行提升 变量声明会提升 变量的赋值是不会提升
提升到了代码段最前面
把使用function声明的函数进行提升 提升的是整个函数声明
代码的执行:
一行一行执行
##6.初步了解执行上下文( Execute Context)
执行上下文( Execute Context):EC
EC的作用:给代码提供数据
代码分两类:
- 全局代码 函数外面的代码叫全局代码
- 函数代码 一个函数就是一个局部代码
全局执行上下文
全局代码在执行时时,就会产生全局的EC。 EG(G)
局部执行上下文:
函数代码在执行时,就会产生局部的EC。调用一个函数就产生一个EC,调用100个函数,就产生100个EC。
EC栈:
栈:杯子
每产生一个EC就会放到杯子中,说白了,就是杯子中放鸡蛋。
栈:先放进去的后出来
##7.加var的变量和没有加var的变量的区别
###1)在全局代码中,加var会提升,没有var的不会提升。
console.log(a);
a = 110; // a is not defined
###2)不管加没加var的全局变量,都会作为window的属性
var a = 1;
b = 2;
console.log(window.a)
console.log(window.b)
###3)没有加var的变量,只能作为全局变量,只要是全局变量,肯定是window的属性
function f() {
a = 666;
}
f()
console.log(window.a)
##4)加var的局部变量,不会作为window的属性
function f() {
var a = 666;
}
f()
console.log(a)
访问一个对象上不存在的属性,结果就是undefined
console.log(window.a) // undefined
##8.let和const声明变量
###1)let声明的变量没有提升(let声明的变量也提升,仅仅是没有初始化)
console.log(a);
let a = 110; // Cannot access ‘a’ before initialization
###2)let 配合 {} 也可以形成块级作用域
if(true){
var a = 110; // 全局变量
// b只能在当前的{}中被访问到 出了块就访问不了
let b = 666; // let + {} 形成块级作用域
}
console.log(b); // b is not defined
###3)使用let声明的变量不会挂载到GO上
let a = 110;
console.log(window.a); // undefined 访问一个对象上没有属性,得到的就是und
###4)使用let不能重复声明
let a = 1;
let a = 2;
console.log(a); // Identifier ‘a’ has already been declared
###访住:不要使用var来定义变量 使用let声明变量
##9.闭包
- 闭包概念:
内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被终结了之后。CSDN
初看概念可能不太好理解,下面通过一个例子演示一下
function A(){
var a = 10;
return function(){
console.log(a);
}
}
var b = A();
b();
简单总结一下就是闭包找到的是其外部函数中对应变量的指。