你们好,我是魔王哪吒,话很少说,今天带来的是一篇《长篇总结之JavaScript,巩固前端基础》文章,欢迎你们喜欢。
复制代码
JavaScript是一种基于对象和事件驱动的客户端脚本语言,最初是为了检验HTML表单输入的正确性,起源于Netscape公司的LiveScript语言。javascript
liveScript ==> javaScript => ECMAscript
css
关系是:liveScript
是javaScript
的一个曾用名,ECMAscript
: 定义了javascript
的语法规范,描述了语言的基本语法和数据类型。前端
JavaScript
是由ECMAScript
语言,Browser Objects(DOM,BOM)
组成。java
//
单行注解node
/**/
多行注解web
语句结束使用分号,若是省略,则由接下肯定语句的结尾。正则表达式
ECMAScript中的一切是区分大小写的,如变量,函数名,操做符。chrome
什么是标识符,变量,函数,属性的名称,或者是函数的参数。express
什么是变量,ECMAScript的变量是松散类型的。松散类型是指能够用来保存任何类型的数据。数组
每一个变量仅仅只是用于保存值的占位符而已。
变量的声明:变量的声明使用var操做符,语法:var变量名。
一次声明多个变量,用逗号隔开。
注意,省略var声明的变量是全局变量,不推荐省略var操做符来定义全局变量。
ECMAScript中分:简单数据类型和复杂数据类型。
简单数据类型也称为基本数据类型,注意,在ES6中新增了symbol数据类型。
基本数据类型5种:
undefined, null, boolean, number, string
复杂数据类型分:object
typeof是用来检测变量的类型。
语法结构,typeof 变量
或者是typeof(变量)
返回值,是string类型,或者是number,boolean,object,function,undefined
等。
undefined
类型只有一个值,便是特殊的undefined
。
说明:通常而言,不存在须要显式地把一个变量设置为undefined
值的状况。
null
值表示一个空对象指针;若是定义的变量准备在未来用于保存对象,那么最好将变量初始化为null而不是其余值。
undefined
值是派生自null
值的,因此undefined==null
的返回结果为true
。
number
知识点number
:表示整数和浮点数。
NaN
是(not a number
)是一个特殊的数值,表示非数字。
任何涉及
NaN
的操做,都会返回NaN
。
NaN
与任何值都不相等,包括NaN
自己。
isNaN
知识点isNaN(n)
表示检测n
是否为“非数值”。返回结果为boolean
。
说明:isNaN()
对接收的数值,先尝试转换为数值,再检测是否为非数值。
Number()
parseInt()
parseFloat()
Number()
能够用于任何数据类型,parseInt()
和parseFloat()
用于把字符串转成数值。
parseInt()
是会忽略字符串前面的空格,直至找到第一个非空格字符。
parseInt()
转换空字符串返回NaN
。
parseInt()
这个函数提供第二个参数,转换时使用的基数。
parseFloat()
从第一个字符开始解析每一个字符,直至碰见一个无效的浮点数字符为止。
除了第一个小数点有效外,
parseFloat()
与parseInt()
的第二个区别在于它始终都会忽略前导的零。
String
类型用于表示由零或多个16位Unicode
字符组成的字符序列。
String()
toString()
str.toString()
将str
转换为字符串。使用String()
函数,可以将任何类型的值转换为字符串。
用于表示真假的类型,便是true
表示真,false
表示假。
除了0以外的全部数字,转换为布尔型都为true。
除了“ ”以外的全部字符,转换为布尔型都为true。
null
和undefined
转换为布尔型为false
。
表达式是将同类型的数据,用运算符号按必定的规则链接起来的,有意义的式子。
操做符的分类
++a
与a++
都对a
进行递增的操做。
区别:
++a
先返回递增以后的a
的值,a++
先返回a
的原值,再返回递增以后的值。
递减同理。
语法:条件?执行代码1:执行代码2
&&
若是第一个操做数隐式类型转换后为true
,那么返回第一个操做数。
若是第一个操做数隐式类型转换后为false
,那么返回第二个操做数。
若是,只有有一个操做数为null,NaN,undefined
,其中一个,就会返回null,NaN,undefined
。
||
或,只要有一个条件成立,返回true
!
非,不管操做数是什么数据类型,逻辑非都会返回一个布尔值。
alert()
,弹出警告对话框
if
语句
if(condition){
statement1;
}else{
statement2;
}
复制代码
语法:prompt()
弹出输入框,有肯定和取消。
var age = prompt("请输入您的年龄")
复制代码
NaN
和任何内容都不相等,包括它自己
语法:new Date().getDay()
获取星期,返回值,number(0-6)
var week = new Date().getDay();
console.log(week);
复制代码
多条件可使用switch
语句
语法:
switch(expression) {
case value: statement
break;
case value: statement
break;
...
defalut: statement
}
复制代码
向浏览器输出内容:document.write("内容")
for
for-in
while
do...while
语法:
while(条件){
执行的代码;
}
复制代码
语法:
do{
须要执行的代码
}while(条件)
复制代码
循环至少要被执行一次。
break
当即退出循环
continue
结束本次循环,继续开始下一次循环
函数的做用就是经过函数能够封装任意多条语句,能够在任何地方,任什么时候候调用执行。
函数是如何定义的,使用function
声明。
函数名属于标识符。
<script>
// 声明一个函数
function myFun(){
alert("我是一个函数");
}
// 函数的调用
myFun();
</script>
复制代码
声明一个带有参数的函数:
function add(num1,num2){
var sum = sum1+sum2;
return sum;
}
console.log(add(2,3));
复制代码
函数会在执行完return
语句以后中止并当即退出,return
语句也能够不带有任何返回值,用于提早中止函数执行又不须要返回值的状况。
掌握
arguments
在ECMAScript
中的参数在内部用一个数组来表示,在函数体内经过arguments
对象来访问这个数组参数。
对象:字符串,函数,数组
内置对象就是浏览器本身封装好的对象。
Array
String
Math
Date
数组是用来存储一组数据的,如何建立数组,数组元素的读和写,数组的length
属性。
建立数组:使用Array
构造函数,new Array()
,使用字面量表示法。
push()
,把参数添加到数组的最后。unshift()
,把参数添加到数组的前面。pop()
,删除最后一个元素,返回被删除的那个元素。shift()
删除第一个元素,返回被删除的那个元素。join
方法,语法:arrayObject.join(separator)
,功能是用于把数组中的全部元素放入一个字符串,返回的值是字符串。
reverse()
方法,语法:arrayObject.reverse()
,功能是用于颠倒数组中元素的顺序,返回值为数组。
sort()
方法,语法:arrayObject.sort(sortby)
,功能是用于对数组的元素进行排序,返回值为数组。-按照字符串比较的。
代码:
arr.sort(function(a,b){return b-a});
复制代码
concat()
方法,是用于链接两个或者多个数组,返回值为数组。
arr3 = arr1.concat(arr2);
复制代码
slice()
截取,从已有的数组中返回选定的元素。
语法:arrayObject.slice(start,end)
splice()
方法-删除-插入-替换删除,语法:arrayObject.splice(index,count)
,功能:删除从index
处开始的零个或多个元素。返回值为含有被删除的元素的数组。
若是count
为0,不删除任何值,若是count
不设置,删除从index
开始的全部值。
插入,语法:arrayObject.splice(index,0,item1,...itemx)
,功能为在指定位置插入值。
替换:语法:arrayObject.splice(index,count,itemq,...itemx)
,功能,在指定位置插入值,同时删除任意数量的项。
index
为起始位置,count
为要删除的项数,item1...itemx
为要插入的项。
indexOf()
,语法,arrayObject.indexOf(searchvalue,startIndex)
,功能,从数组的开头(位置为0)开始向后查找。
返回值为number
,没有找到的话就是返回-1
,查找到返回在数组中的位置。
lastIndexOf()
,语法:arrayObject.lastIndexOf(searchvalue,startIndex)
,功能是从数组的末尾开始向前查找。
String
字符串的方法:
charAt()
charCodeAt()
indexOf()
lastIndexOf()
charAt()
与charCodeAt()
的区别
语法:stringObject.charAt(index)
,功能返回stringObject
中的index
位置的字符。
语法:stringObject.charCodeAt(index)
,功能返回stringObject
中的index
位置字符的字符编码。
字符串对象的截取:
slice()
substring()
substr()
数组对象也有slice()
的语法
对于字符串的截取:
语法:stringObject.slice(start,end)
功能,截取子字符串。
参数说明:
start
为指定字符串的开始位置。end
为表示字符串到哪里结束,end
自己不在截取范围以内。substring()
substring()
语法,主要区别是这个当参数为负数时,自动转换为0。
substring()
会将小的数看成开始位置,把较大的数看成结束位置。
substr()
,语法:stringObject.substr(start, len)
功能是截取字符串。
start
为指定字符串开始的位置,len
为表示截取的字符总数,省略时截取到字符串的末尾。
当start
为负数时,会将传入的负值与字符串的长度相加。而len
为负值时,返回字符串。
代码:
字符串长度为11
str.substring(6,9);
str.substr(6,3);
str.substr(-5,4); // (6,4)
str.substr(3,-4);
复制代码
var url="http://xxx/index.txt";
function getFileFormat(url) {
var pos = url.lastIndexOf(".");
return url.substr(pos); // .txt
}
var formatName = getFileFormat(url);
复制代码
split()
语法:stringObject.split(separator)
。
功能,把一个字符串分割成字符串数组。返回值为array
。
separator
为分隔符。
replace()
替换语法:stringObject.replace(regexp/substr,replacement)
功能:在字符串中用一些字符替换另外一些字符,或替换一个与正则表达式匹配的子串。返回值为String
。
语法:stringObject.toUpperCase()
,把字符串转换为大写。
语法:stringObject.toLowerCase()
,把字符串转换为小写。
str.charAt(6).toUpperCase();
复制代码
将每个单词的首字母转换为大写,链接剩余的字符
var newStr = word.charAt(0).toUpperCase()+word.substr(1);
复制代码
min()
max()
ceil()
,向上取整。floor()
,向下取整。round()
abs()
取整,ceil()
,floor()
Math.ceil()
语法:Math.ceil(num)
,功能为向上取整,即返回大于num
的最小整数。
Math.floor(num)
,向下取整,返回num
的整数部分。
Math.round()
语法,功能是将数值四舍五入为最接近的整数。
Math.abs()
功能是返回num
的绝对值,语法:Math.abs(num)
,返回值为Number
。
random()
方法-随机数封装一个求n到m之间的随机整数的函数。
random=Math.floor(Math.random()*(m-n+1)+n);
Math.random()
语法,是返回大于等于0小于1的随机数。
new Date()
为建立一个日期时间对象。不传参,返回当前的日期时间对象。
getFullYear()
返回4位数的年份。getMonth()
返回日期中的月份,返回值为0-11。getDate()
返回月份中的天数。getDay()
返回星期,返回值为0-6。getHours()
返回小时。getMinutes()
返回分。getSeconds()
返回秒。getTime()
返回表示日期的毫秒数。代码:
var today = new Date(),
year = today.getFullYear(),
month = today.getMonth()+1,
date = today.getDate(),
week = today.getDay(), // 0-6
hours = today.getHours(),
minutes = today.getMinutes(),
seconds = today.getSeconds(),
复制代码
setFullYear(year)
设置4位数。setMonth(mon)
设置日期中的月份。setDate()
设置日期。setHours()
设置小时。setMinutes()
设置分。setSeconds()
设置秒。setTime()
以毫秒数设置日期,会改变整个日期。Chrome DevTools
的基本使用语法错误:不符合js语法的错误。
运行时错误,代码没有语法错误,可是在运行时发生错误。
什么是逻辑错误?就是指计算结果很想象的不同。
代码:
function foo() {
try {
throw new Error();
}catch(e){
return 1;
}finally{
return 2;
}
}
复制代码
DOM操做,添加节点,删除节点,修改节点,查找节点。
DOM document(文档) object(对象) model(模型)
document.write()
建立节点
create
建立方法:
document.createElement()
document.createTextNode()
document.createDocumentFragment()
document.createComment()
代码create
建立节点:
myReady(function(){
var ul = document.getElementById("myList");
var li = document.createElement("li");
ul.appendChild(li);
});
<ul id="myList"></ul>
复制代码
建立节点的高效方法:
outerText
,innerText
innerHTML
,outerHTML
documentElement
属性可返回文档的根节点
tagName
属性返回元素的标签名
类数组对象NodeList
类数组对象HTMLCollection
Ele.getElementsByTagName()
document.scripts
document.links
document.images
document.forms
tr.cells
select.options
示例:
myReady(function(){
var scripts = document.scripts;
var links = document.links;
var cells = document.getElementById("tr").cells;
var imgs = document.images;
var forms = document.forms;
var options = document.getElementById("select").options;
var ps = document.getElementsByTagName("p");
}
复制代码
类数组对象
NamedNodeMap
Ele.attributes
类数组对象的动态性
三个集合NodeList
,HTMLCollection
,NamedNodeMap
都是动态的。
节点查找
getElementById()
getElementByName()
getElementByTagName()
getElementByClassName()
querySelector()
querySelectorAll()
document.getElementById()
document.getElementsByClassName()
document.getElementsByTagName()
document.getElementsByName()
伪数组
获取元素属性
ele.setAttribute("属性名","属性值")
ele.getAttribute("属性名")
ele.removeAttribute("属性名")
ele.dataset.prop="值"
复制代码
dom.style.prop
window.getComputeStyle(ele,null)
ele.currentStyle
ele.id ele.title
获取元素的内容
innerHTML:
innerText:
value:
使用于表单
offset
系列属性
滚动条滚动的距离:
window.pageYOffset(ie9如下不支持)
document.body.scrollTop
document.documentElement.scrollTop;
复制代码
可视窗口尺寸:
window.innerWidth(IE8如下不兼容)
document.documentElement.clientWidth
document.body.clientWidth(怪异模式)
判断怪异模型的方法
document.compatMode
复制代码
滚动到指定位置
scroll(x,y) scrollTo(x,y) scrollBy(x,y);
复制代码
querySelector()
和querySelectorAll()
querySelector()
返回指定css
选择器的一个元素
querySelectorAll()
返回指定css
选择器的一组元素
appendChild()
insertBefore()
replaceChild()
cloneNode()
normalize()
splitText()
appendChild()
为指定元素节点的最后一个子节点以后添加节点,该方法返回新的子节点。
insertBefore()
在指定的已有子节点以前插入新的子节点。
replaceChild()
该方法用于新节点替换某个子节点。返回被替换的节点。
cloneNode()
建立节点的拷贝,并返回该副本。
var myUrl = document.getElementById("myUrl");
var newNode = myUrl.cloneNode(true); // 深度,有其子节点,默认为false,只有父节点
复制代码
normalize()
可以合并相邻的Text
节点。
代码:
myReady(function(){
var div = document.createElement("div");
var textNode = document.createTextNode("dom");
div.appendChild(textNode);
var textNode2 = document.createTextNode("web");
div.appendChild(textNode2);
document.body.appendChild(div);
console.log(div.childNodes.length);
div.normalize();
console.log(div.childNode);
console.log(div.firstChild.nodeValue);
}
复制代码
splitText()
按照指定的位置把文本节点分割为两个节点。
removeChild()
removeNode()
innerHTML
deleteContents()
textContent
removeChild()
删除某个节点中指定的子节点。
removeChild()
必须有参数
myReady(function(){
var myUrl = document.getElementById("myUrl");
console.log(myUrl.childNodes.length);
var secondChild = myUrl.removeChild(myUrl.childNode[1]);
console.log(secondChild);
console.log(myUrl.childNodes.length);
}
复制代码
removeNode()
ie
的私有实现false
removeChild()
和innerHTML
比较
HTML DOM removeChild()
方法
var list=document.getElementById("myList");
list.removeChild(list.childNodes[0]);
复制代码
移除前:
Coffee
Tea
Milk
复制代码
移除后:
Tea
Milk
复制代码
浏览器支持 Internet ExplorerFirefoxOperaGoogle ChromeSafari
全部主要浏览器都支持 removeChild
方法
语法node.removeChild(node)
建立节点,查找节点,操做节点,删除节点
示例:
<div
id="div0"
class="active"
style=""
url=""
xxx=""></div>
复制代码
属性分:property
固有属性和attribute
自定义属性
getNamedItem()
removeNamedItem()
setNamedItem()
示例:
myReady(function(){
var inputs = document.querySelectorAll("input”);
inputs[0].checked = true;
}
<input type="checkbox">1
<input type="checkbox" checked="checked">2
<input type="checkbox" checked>3
复制代码
性别:
男 女
示例:
性别:<br/>
<input type="radio" name="gender" value="male" checked>男
<input type="radio" name="gender" value="female">女
复制代码
你去过的城市:
示例:
你去过的城市:<br/>
<select name="city" id="city">
<option value="北京">北京</option>
<option value="上海">上海</option>
</select>
复制代码
你去过的城市:
示例:
你去过的城市:<br/>
<select name="city" id="city" multiple="multiple">
<option value="北京">北京</option>
<option value="上海" selected>上海</option>
<option value="纽约">纽约</option>
</select>
复制代码
前端
示例:
<p style="text-align:center" title="前端">前端</p>
复制代码
什么是事件?是文档或浏览器窗口发生的一些交互瞬间。
事件方法:
onload
页面加载时触发onclick
鼠标点击时触发onmouseover
鼠标滑过期触发onmouseout
鼠标离开时触发onfoucs
获取焦点时触发onblur
失去焦点时触发onchange
域的内容改变时发生HTML事件
示例:
<input type="button" value="弹出" onclick='alert("我是按钮")'>
复制代码
绑定事件的方法:
1.onclick:
this
指向dom
元素自己2.obj.addEventListener(type,fn,false);
IE9
如下不兼容this
指向dom
元素自己3.obj.attchEvent("on"+type,fn);
IE
独有this
指向window
onsubmit
表单中的确认按钮被点击时发生onmousedown
鼠标按钮在元素上按下时触发onmousemove
在鼠标指针移动时发生onmouseup
在元素上松开鼠标按钮时触发onresize
当调整浏览器窗口的大小时触发onscroll
拖动滚动条滚动时触发keyCode
属性onkeydown
在用户按下一个键盘按键时发生
onkeypress
在按下键盘按键时发生
onkeyup
在键盘按键被松开时发生
keyCode
返回onkeypress
,onkeydown
或onkeyup
事件触发的键的值的字符代码,或键的代码。
当用户与web页面进行某些交互时,解释器就会建立响应的event
对象以描述事件信息。
事件句柄,称事件处理函数,事件监听函数,指用于响应某个事件而调用的函数。
移除事件,removeEventListener()
语法:element.removeEventListener(event,function,useCapture)
,功能,移除addEventListener()
方法添加的事件句柄。
示例:
var btn2 = document.getElementById("btn2");
btn2.addEventListener('click',function(){
alert('btn2');
},false);
// 事件解绑
btn2.removeEventListener('click',function(){
alert('btn2');
});
复制代码
事件解绑成功的主要缘由在保存addxx和removexx里面的参数相同。
ie
事件流(ie
事件处理程序)
添加事件:attachEvent()
语法:element.attachEvent(event,function)
功能是用于向指定元素添加事件句柄
移除事件
detachEvent()
语法:element.detachEvent(event,function)
功能是移除attachEvent()
方法添加的事件句柄。
事件周期:事件捕获(事件对象沿dom
树向下传播),目标触发(运行事件监听函数),事件冒泡(事件沿着dom
树向上传播)。
示例:
// 事件冒泡
document.getElementById('parent').addEventListener("click",function(e){
alert("parent事件被触发"+this.id);
})
document.getElementById("child").addEventListener("click",ffunction(e){
alert("child事件被触发"+this.id);
})
复制代码
事件委托的原理就是事件冒泡
event
对象属性与方法
type
事件的类型,srcElement/target
事件源,就是发生事件的元素。
阻止默认行为
var link = document.getElementById("mylink");
link.onClick = function(event){
event.preventDefault();
}
复制代码
取消事件捕获或者冒泡
var btn = document.getElementById("myBtn");
btn.onclick=function(event){
alert("Click");
event.stopPropagation();
}
document.body.onclick = function(event){
alert("Body clicked");
}
复制代码
target
点击谁谁就是target
,事件源
currentTarget
事件绑定在谁身上,就指向谁
clientY
就是指浏览器顶部底边到鼠标的位置
pageY
就是指浏览器顶部底边到鼠标的位置
screenY
就是指屏幕顶部到鼠标位置
srcElement/target
事件源,就是发生事件的元素。cancelBubble
布尔属性,设置为true
时,将中止事件进一步起泡到包容层次的元素。returnValue
布尔属性,设置为false
时能够组织浏览器执行默认的事件动做。示例:
var EventUtil = {
addHandler: function(element, type, handler) {
},
getTarget: function(event){
return event.target || event.srcElement;
},
preventDefault: function(event){
if(event.preventDefault){
event.preventDefault();
}else{
event.returnValue = false;
},
removeHandler: function(element,type,handler){
},
stopPropagation: function(event){
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble = true;
}
}
}
}
复制代码
Event addEventListener attacEvent
示例:
var EventUtil = {
addHandler: function(element,type,handler){
},
removeHandler: function(element,type,handler){
}
}
复制代码
什么是bom
Bom
浏览器对象模型。
Window
对象表示浏览器中打开的窗口。
若是文档包含框架(<frame> 或 <iframe> 标签)
,浏览器会为 HTML
文档建立一个 window
对象,并为每一个框架建立一个额外的 window
对象。
全局变量
window
声明和关键字声明
window.变量名=值
和var 变量名=值
window
对象的方法
语法:window.alert("content")
语法:window.confirm("message")
Window | 对象属性 |
---|---|
属性 | 描述 |
closed | 返回窗口是否已被关闭。 |
defaultStatus | 设置或返回窗口状态栏中的默认文本。 |
document | 对 Document 对象的只读引用 |
frames | 返回窗口中全部命名的框架。该集合是 Window 对象的数组,每一个 Window 对象在窗口中含有一个框架。 |
history | 对 History 对象的只读引用。 |
innerHeight | 返回窗口的文档显示区的高度。 |
innerWidth | 返回窗口的文档显示区的宽度。 |
localStorage | 在浏览器中存储 key/value 对。没有过时时间。 |
length | 设置或返回窗口中的框架数量。 |
location | 用于窗口或框架的 Location 对象。请参阅 Location 对象。 |
name | 设置或返回窗口的名称。 |
navigator | 对 Navigator 对象的只读引用 |
超时调用,间歇调用
语法:setTimeout(code,millisec)
语法:setInterval(code,millisec)
示例:
var intervalId = setInterval(function(){
console.log("web");
},1000);
setTimeout(function(){
clearInterval(intervalId);
},10000);
复制代码
函数能够访问由函数内部定义的变量,如:
实例
function myFunction() {
var a = 1;
return a * a;
}
复制代码
函数也能够访问函数外部定义的变量,如:
实例
var a = 1;
function myFunction() {
return a * a;
}
复制代码
location
对象提供了与当前窗口中加载的文档有关的信息,还提供了一些导航的功能,它既是window
对象的属性,也是document
对象的属性。
location.href
返回当前加载页面的完整的url。
location.host
返回服务器名称和端口号。
location.hostname
返回不带端口号的服务器名称。
location.pathname
返回url
中的目录和文件名。
location.port
返回url
中指定的端口号,若是没有,返回空字符串。
location.protocol
返回页面使用的协议。
location.search
返回url
的查询字符串。
改变浏览器位置的方法:
location.href
属性。
location
对象其余属性也是能够改变url
location.hash
和location.search
location.replace()
是从新定向url
location.reload()
从新加载当前显示的页面
history
对象保存了用户在浏览器中访问页面的历史记录
history.back()
回到历史记录的上一步
示例:
var btn = document.getElementById("btn");
// 点击btn按钮时回到历史记录的上一步
btn.onclick = function(){
//history.back();
history.go(-1);
}
复制代码
history.forward()
历史记录的下一步
history.go(-n)
回到历史记录的前n步
history.go(n)
回到历史记录的后n步
screen
对象属性
screen.availWidth
返回可用的屏幕宽度
screen.availHeight
返回可用的屏幕高度
获取窗口文档显示区的高度和宽度,可使用innerHeight
和innerWidth
navigator
对象
示例:
// 检测浏览器类型
function getBrowser(){
// 获取userAgent属性
var explorer = navigator.userAgent.toLowerCase(),browser;
if(explorer.indexOf("mise")>-1){
browser = "IE";
}else if(explorer.indexOf("chrome")>-1){
browser = "chrome";
}else if(explorer.indexOf("opera")>-1){
browser = "opera";
}else if(explorer.indexOf("safari")>-1){
browser = "safari"
}
return browser;
}
复制代码
什么是执行上下文环境?
console.log(a); // undefined
console.log(this); //window
b(); // b() is not a function
c(); // "c"
var a = "a";
var b = function () {
var b = "b"
console.log(b);
}
function c () {
var c = "c"
console.log(c);
}
复制代码
上下文栈就是一个存储执行上下文的栈,栈中只有一个上下文是处于活动状态的,执行全局代码时就会有一个全局上下文被压入栈,调用一个函数时就会产生一个函数的上下文环境,而后将其压入栈
js的做用域是词法做用域(静态做用域),实际上大部分的语言做用域都是词法做用域,与词法做用域相对的是动态做用域
闭包是指有权访问另外一个函数做用域中变量的函数。
做用域链指向的变量对象
造成闭包即要把一个函数当成值传递,该函数还引用另外一个函数的做用域链使得被引用的函数不能被回收
优势:
扫码关注公众号,订阅更多精彩内容。