js高级——作用域链
2017-12-28 07:54
176 查看
1.作用域链:只有函数可以制造作用域结构,所以只要是代码就至少有一个作用域(即全局作用域)
(1)凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中又可以诞生一个作用域。将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构,就称作作用域链
(2)只要是函数就可以创造作用域
函数中又可以再创建函数
函数内部的作用域可以访问函数外部的作用域
如果有多个函数嵌套,那么就会构成一个链式访问结构 --> 作用域链
//f1 --> 全局
function
f1(){
//f2 --> f1 --> 全局
function
f2(){
//f3 --> f2 --> f1 --> 全局
function
f3(){
}
//f4 --> f2 --> f1 --> 全局
function
f4(){
}
}
//f5 --> f1 --> 全局
function
f5(){
}
}
2.绘制作用域链图
function
f1(){
function
f2(){
}
}
var
num =
456 ;
function
f3(){
function
f4(){
}
}
(1)绘制作用域链的步骤
·看整个全局是一条链,即顶级连,记为0链
·看全局作用域中有什么变量和函数声明就以方格的形式绘制到0级链上
·再找函数,只有函数可以限制作用域,因此从函数中引入新链,标记为1级链
·然后在每一个1级链中再次往复以上的行为
(2)变量的访问规则
·首先看变量在第几条链上,在该链上看是否有变量的定义与赋值,如果有就直接使用
·如果没有到上一级链上找(n - 1级链),如果有就直接用,停止继续查找
·如果还没有再次网上查找,知道全局链(0级),如果还是没有就是is not defined
·注意:同级的链不可混合查找
3.注意点
(1)并不是在函数内部写了变量,这个变量就属于这个函数的作用域,而是必须使用var关键字来声明该变量,这个变量才会属于这个作用域
(2)声明函数时的函数名,其实也是一个变量名,可以通过这个变量名来给其赋值(不管是赋什么值)
(3)函数在声明出来的时候,里面的代码不会执行,只有在调用的时候代码才会执行
(4)变量搜索原则
·首选在当前链上找
·如果有,就停止查找
·如果没有,就在n-1级上查找(在函数内部允许访问定义在函数外部的变量)
·如此循环往复直到0级链
·如果找到,就结束查找,直接获得该链上变量的数据
·如果还没有就抛出异常
(1)凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中又可以诞生一个作用域。将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构,就称作作用域链
(2)只要是函数就可以创造作用域
函数中又可以再创建函数
函数内部的作用域可以访问函数外部的作用域
如果有多个函数嵌套,那么就会构成一个链式访问结构 --> 作用域链
//f1 --> 全局
function
f1(){
//f2 --> f1 --> 全局
function
f2(){
//f3 --> f2 --> f1 --> 全局
function
f3(){
}
//f4 --> f2 --> f1 --> 全局
function
f4(){
}
}
//f5 --> f1 --> 全局
function
f5(){
}
}
2.绘制作用域链图
function
f1(){
function
f2(){
}
}
var
num =
456 ;
function
f3(){
function
f4(){
}
}
(1)绘制作用域链的步骤
·看整个全局是一条链,即顶级连,记为0链
·看全局作用域中有什么变量和函数声明就以方格的形式绘制到0级链上
·再找函数,只有函数可以限制作用域,因此从函数中引入新链,标记为1级链
·然后在每一个1级链中再次往复以上的行为
(2)变量的访问规则
·首先看变量在第几条链上,在该链上看是否有变量的定义与赋值,如果有就直接使用
·如果没有到上一级链上找(n - 1级链),如果有就直接用,停止继续查找
·如果还没有再次网上查找,知道全局链(0级),如果还是没有就是is not defined
·注意:同级的链不可混合查找
3.注意点
(1)并不是在函数内部写了变量,这个变量就属于这个函数的作用域,而是必须使用var关键字来声明该变量,这个变量才会属于这个作用域
(2)声明函数时的函数名,其实也是一个变量名,可以通过这个变量名来给其赋值(不管是赋什么值)
(3)函数在声明出来的时候,里面的代码不会执行,只有在调用的时候代码才会执行
(4)变量搜索原则
·首选在当前链上找
·如果有,就停止查找
·如果没有,就在n-1级上查找(在函数内部允许访问定义在函数外部的变量)
·如此循环往复直到0级链
·如果找到,就结束查找,直接获得该链上变量的数据
·如果还没有就抛出异常
相关文章推荐
- JS高级程序设计第四章笔记作用域&作用域链
- 第十八篇 js高级知识---作用域链
- JS高级心法——作用域链
- JS高级心法——作用域链
- 第18篇 js高级知识---作用域链
- JS高级知识(作用域,作用域链,闭包)
- js高级知识---作用域链
- JS&jQuery高级04(数组的遍历)
- JS高级拖动技术 setCapture,releaseCapture
- 第十九篇 js高级知识---词法分析和AO 链
- js:数据结构笔记14--高级算法
- JS高级程序设计笔记(四):类和继承
- js高级程序设计之跨浏览器事件处理
- 《js高级程序设计(第三版)》第五章学习笔记
- js高级
- 深入彻底理解原生js的作用域、作用域链(以及浏览器是怎样解析js代码的)
- JS对象高级属性:数据属性与访问器属性
- 对象的查询和设置(JS高级)
- js 高级知识---深入原型链