文 / 掘金
大家好,我是魔王哪吒,话不多说,今天带来的是一篇《长篇总结之JavaScript,巩固前端基础》文章,欢迎大家喜欢。
liveScript ==> javaScript => ECMAscript
关系是:liveScript
是javaScript
的一个曾用名,ECMAscript
: 定义了javascript
的语法规范,描述了语言的基本语法和数据类型。
JavaScript
是由ECMAScript
语言,Browser Objects(DOM,BOM)
组成。
语法:
//单行注解
/**/多行注解
语句结束使用分号,如果省略,则由接下确定语句的结尾。
ECMAScript中的一切是区分大小写的,如变量,函数名,操作符。
什么是标识符,变量,函数,属性的名称,或者是函数的参数。
由字母,数字,下划线或者是美元符号组成。
不能以数字开头。
不能使用关键字,保留字等作为标识符。
什么是变量,ECMAScript的变量是松散类型的。松散类型是指可以用来保存任何类型的数据。
每个变量仅仅只是用于保存值的占位符而已。
变量的声明:变量的声明使用var操作符,语法: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
。
什么是表达式
JavaScript操作符的分类
学习算数操作符
表达式是将同类型的数据,用运算符号按一定的规则连接起来的,有意义的式子。
操作符的分类
算数操作符
逻辑操作符
赋值操作符
比较操作符
三元操作符
++a
与a++
都对a
进行递增的操作。
区别:
++a
先返回递增之后的a
的值,a++
先返回a
的原值,再返回递增之后的值。
递减同理。
赋值操作符
比较操作符
三元操作符
语法:条件?执行代码1:执行代码2
&&
如果第一个操作数隐式类型转换后为true
,那么返回第一个操作数。
如果第一个操作数隐式类型转换后为false
,那么返回第二个操作数。
如果,只有有一个操作数为null,NaN,undefined
,其中一个,就会返回null,NaN,undefined
。
||
或,只要有一个条件成立,返回true
!
非,无论操作数是什么数据类型,逻辑非都会返回一个布尔值。
学习掌握if,prompt(),alert()
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
声明。
函数名属于标识符。
声明一个带有参数的函数:
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);
});
创建节点的高效方法:
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()
根据ID获取元素
返回一个元素
对ID区分大小写(IE8和IE8以上)
document.getElementsByClassName()
根据class名获取元素
返回是一个伪数组
IE8和IE8以下不支持
document.getElementsByTagName()
根据标签名获取元素
返回一个伪数组
兼容很好
document.getElementsByName()
根据name名获取,一般应用于表单
返回伪数组
只针对对name属性有效的标签生效。
伪数组
必须是对象
必须有length属性
存放内容必须以索引+内容
有数组的一些基本特性,但是不能使用数组的方法。
获取元素属性
ele.setAttribute("属性名","属性值")
ele.getAttribute("属性名")
ele.removeAttribute("属性名")
ele.dataset.prop="值"
dom.style.prop
可读写行间样式
写入的值必须是字符串格式
window.getComputeStyle(ele,null)
null的地方可以存放伪类
返回的都是绝对值
是只读的,不可修改
ele.currentStyle
是只读的,不可修改
返回的是经过转换的绝对值
IE独有的属性
ele.id ele.title
获取样式:ele.style.prop--效率低,维护不方便
ele.className---维护方便
获取元素的内容
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)
创建节点,查找节点,操作节点,删除节点
示例:
属性分:property
固有属性和attribute
自定义属性
getNamedItem()
removeNamedItem()
setNamedItem()
示例:
myReady(function(){
var inputs = document.querySelectorAll("input”);
inputs[0].checked = true;
}
1
2
3
男女
示例:
性别:
男
女
你去过的城市:
示例:
你去过的城市:
你去过的城市:
北京上海纽约
示例:
你去过的城市:
前端
示例:
前端
什么是事件?是文档或浏览器窗口发生的一些交互瞬间。
事件方法:
onload
页面加载时触发
onclick
鼠标点击时触发
onmouseover
鼠标滑过时触发
onmouseout
鼠标离开时触发
onfoucs
获取焦点时触发
onblur
失去焦点时触发
onchange
域的内容改变时发生
HTML事件
示例:
绑定事件的方法:
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
对象表示浏览器中打开的窗口。
如果文档包含框架( 或
,浏览器会为 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的作用域是词法作用域(静态作用域),实际上大部分的语言作用域都是词法作用域,与词法作用域相对的是动态作用域
闭包是指有权访问另一个函数作用域中变量的函数。
作用域链指向的变量对象
形成闭包即要把一个函数当成值传递,该函数还引用另一个函数的作用域链使得被引用的函数不能被回收
优点:
闭包里的变量不会污染全局,因为变量被封在闭包里
所有变量都在闭包里保证了隐私性和私有性
扫码关注公众号,订阅更多精彩内容。
推荐文章:
考前复习必备MySQL数据库(关系型数据库管理系统)