作用域 — 可以从中访问变量的“区域”。
词法作用域— 在词法阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。
块作用域 — 由花括号{}创建的范围
作用域链 — 函数可以上升到它的外部环境(词法上)来搜索一个变量,它可以一直向上查找,直到它到达全局作用域。
同步 — 一次执行一件事, “同步”引擎一次只执行一行,JavaScript是同步的。
异步 — 同时做多个事,JS通过浏览器API模拟异步行为
事件循环(Event Loop) - 浏览器API完成函数调用的过程,将回调函数推送到回调队列(callback queue),然后当堆栈为空时,它将回调函数推送到调用堆栈。
堆栈 —一种数据结构,只能将元素推入并弹出顶部元素。 想想堆叠一个字形的塔楼; 你不能删除中间块,后进先出。
堆 — 变量存储在内存中。
调用堆栈 — 函数调用的队列,它实现了堆栈数据类型,这意味着一次可以运行一个函数。 调用函数将其推入堆栈并从函数返回将其弹出堆栈。
执行上下文 — 当函数放入到调用堆栈时由JS创建的环境。
闭包 — 当在另一个函数内创建一个函数时,它“记住”它在以后调用时创建的环境。
垃圾收集 — 当内存中的变量被自动删除时,因为它不再使用,引擎要处理掉它。
变量的提升— 当变量内存没有赋值时会被提升到全局的顶部并设置为undefined
。
this —由JavaScript为每个新的执行上下文自动创建的变量/关键字。
document.getElementById("myList").replaceChild(newnode,oldnode); //newnode,oldnode均为节点对象
a=document.getElementsByClassName("pre") console.log(a[0].lastChild) 获取pre下最后一个子节点,包括文本节点 console.log(a[0].firstChild) 获取pre下第一个子节点,包括文本节点 console.log(a[0].childNodes) 获取pre下所有子节点,包括文本节点。 console.log(a[0].children) 获取pre下所有子节点,不包括文本节点。
console.log("getElementsByClassName",document.getElementsByClassName("child")) console.log("getElementById",document.getElementById("id"))
console.log("getElementsByTagName",document.getElementsByTagName("div" )) console.log("getElementsByName",document.getElementsByName("one")) console.log(document.querySelector("div")) console.log(document.querySelectorAll("div"))
ECMAScript中重载的定义
重载:就是根据参数,选择相同函数名而参数不同的函数
arguments 对象(函数参数的集合)
function box(){ return arguments[0]+arguments[1]+arguments[2]; } alert(box('haha','dianshi'),99);
JavaScript 程序
计算机程序是由计算机“执行”的一系列“指令”。
在编程语言中,这些编程指令被称为语句。
JavaScript 程序就是一系列的编程语句。
注释:在 HTML 中,JavaScript 程序由 web 浏览器执行。
var a,b,c
a=b=c=1
浏览器提示框
<script> window.alert(5 + 6); </script>
浏览器控制台
<script> console.log(5 + 6); </script>
字面量 :源代码中直接代表某个常数值的一种表达形式,又2称混合值,可以是数字,字符串等
数字字面量:
字符串字面量:“ll”
数组字面量 数字var arr = [1,2,3];
正则表达式字面量 var reg = /[a-z]/g;
对象字面量:{}
变量:源代码中可变的表示法
构造器函数:new Object()
---------------- constructor ---------------- 举个栗子: var Student = function() { this.name = 'default'; this.say = function() { console.log('say hello!'); } } 这里的say方法放在构造函数的内部是不妥的。对于可以重用的成员,建议放在原型链上,主要是因为它一直保存在内存中。 所以可以改为: Student.prototype.say = function() { console.log('say hello!'); } 如果我们创建实例的时候,丢失new呢? var s1 = Student(); console.log(window.name); //"default" 缺少new关键字之后,对于Student内部的this便指向了全局对象。这是很糟糕的一件事。 这也是为什么规定构造函数的首字符大写的原因。 去new --------------- 去掉new关键字 --------------- function People() { if(!(this instanceof People)) { return new People(); } this.name = "default"; } 我们还可以通过arguments.callee完成同样的效果,不过在ES5的"use strict"模式下被禁用了。