js---10作用域链
<html> <head>
<title>scope basic</title>
</head>
<body> <script type="text/javascript">
//作用域:成员,函数,变量可以被访问的范围。块作用域,函数作用域,动态作用域,词法作用域(静态作用域或者闭包)
//js不是块作用域
alert(a);//undifiend
alert(b);//undifiend
alert(c);//报错
alert(d);//报错 var a = 1;//全局window成员
if(false){//预处理阶段,if语句当成不存在一样,所以会把b加入全局window对象
var b = 2;
}else {
c = 3;//不是全局window成员,没有var声明,
}
function f () {//f是window全局成员
var d = 4;//d属于f的成员,外部访问不了,
} --------------------------------------------------------
//块作用域:大括号括起来的代码
for(var i =0; i < 3 ; i++){ }
alert(i); //弹出3,说明js没有块作用域.
//js也没有函数作用域 ------------------------------------------------------
//动态作用域,变量的值在执行的时候有值,所以js没有动态作用域
//静态作用域:在函数创建的时候,函数有一个成员scope。他的值是创建这个函数的环境(window对象或者其他)
function f () {//scope == window
alert(x);//函数f调用的时候,会首先在函数自己的词法环境中找x,找不到就去他的scope中找,scope是window,也没有x就报错。
} function f1 () {
var x = 5;
f(); //弹出5,实际报错,x未定义
} function f2 () {
var x = 6;
f();//弹出6,实际报错,x未定义
}
f1();f2();
--------------------------------------------------- //静态作用域:在函数创建的时候,函数有一个成员scope。他的值是创建这个函数的环境(window对象或者其他)
//作用域链:f.scope = window ,f调用的时候会创建自己的词法环境le(函数局部作用域),并且跟scope关联起来,f.le = f.scope,f的词法环境le(函数局部作用域)中有le{x : 100 ; g :指向函数引用},创建函数g时候g.scope = f.le,g函数调用时候会创建自己的词法环境(g的函数局部作用域)le,并且跟自己的scope关联,
function f () { //f.scope == window
//f.le{x =100} ->f. scope
var x = 100;
function g () { //g. scope ==f.le
//g.le ->g. scope
}
g();
}
//函数他自己的环境 --> 他自己的scope --> 指向创建他的环境,
// g.le ->g. scope ->f.le ->f. scope ==winow
//f.le ---> f.scope ---> 创建他的环境
//如果函数作用域找不到变量,就是创建这个函数的作用域去找变量 -------------------------------------------------------
//函数创建方式
function f(){}
var f = function(){}//匿名函数
var f1 = function x(){}//这种方式创建函数很少,x永远访问不到
var f2 = new Function('参数',函数体)
//每创建一个函数就形成一个新的作用域,跟父的作用域形成一个链条,作用域链:函数自己的作用域(大括号范围)找不到就去父级的作用域去找。new Function创建的作用域永远是全局作用域
function f () {
var x = 100;
var g = function () {
alert(x);
}
g();//
}
f(); function f () {
var x = 100;
//g.[[scope ]]=window
var g = new Function("","alert(x)");//只会去window作用范围去找
g();
}
f(); --------------------------------------------
(function(){
var a = 5;
var b = 6;
function f(){
alert(a);
}
window.f = f;
})();
f(); </script>
</body> </html>
作用域链:函数自己的作用域(大括号范围)找不到就去父级(父函数)的作用域去找。
<html>
每个函数有2个属性,一个是谁创建了这个函数(函数定义写在哪里面谁就是创建他的那个谁),一个是函数的作用域(函数题的局部作用域中有哪些属性和函数)。
<script>
var x=6;
function f () { //f.le={x:未定义},f.scope=window(window创建的f函数不是f1的作用于创建的函数)
alert(x);
} function f1 () {
var x = 5;
f(); //6,f.le={x:未定义},f.scope=window(window创建的f函数不是f1的作用于创建的函数)
function f2(){
alert(x);
};
f2();//5,f2的作用域f2.le={x:未定义},f2的创建他自己这个函数的变量f2.scope=f1.le,因为是f1的作用域创建了f2函数。
} f1(); (function(){
var a = 1;
var b = 2;
function f3(){
alert(a);
}
window.f3 = f3;
})();
f3();//1 </script>
</html>
js---10作用域链的更多相关文章
- js中作用域链的问题
为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...
- JS 之作用域链和闭包
1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...
- JS的作用域链与this指向
JS的作用域链是在函数创建时创建的.而this对象是在函数运行期间绑定的. 下面看几个例子,说明JS的作用域链和this是两套分离的链. 1) var name = 'window下的name< ...
- 浅谈JS的作用域链(一)
JS的执行环境 执行环境(Execution context,EC)或执行上下文,是JS中一个极为重要的概念. 在JavaScript中有三种代码运行环境: Global Code JavaScrip ...
- JS的作用域链与原型链
来一波,好记性不如烂笔头. 这两条链子可是很重要的. 作用域链 当执行一段JS代码(全局代码或函数)时,JS引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加 ...
- 浅谈JS的作用域链(三)
前面两篇文章介绍了JavaScript执行上下文中两个重要属性:VO/AO和scope chain.本文就来看看执行上下文中的this. 首先看看下面两个对this的概括: this是执行上下文(Ex ...
- 浅谈JS的作用域链(二)
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- js中作用域链和作用域
作用域 在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称(变量名或者函数名)进行变量查找. 经过研究<高级程序设计 ...
- 深入理解JS函数作用域链与闭包问题
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...
- 《浏览器工作原理与实践》<10>作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?
在上一篇文章中我们讲到了什么是作用域,以及 ES6 是如何通过变量环境和词法环境来同时支持变量提升和块级作用域,在最后我们也提到了如何通过词法环境和变量环境来查找变量,这其中就涉及到作用域链的概念. ...
随机推荐
- 解读邮箱正则表达式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
转自:http://www.cnblogs.com/joyceTING/archive/2013/05/09/3069089.html正则表达式 \w+([-+.]\w+)*@\w+([-.]\w+) ...
- springMVC怎么接收日期类型的参数?
springMVC怎么接收日期类型的参数? springMVC的controller中用实体接受页面传递的参数,并且实体中的属性类型为日期类型,怎么接收呢?如果接收不到会进不到controller中. ...
- Android 自定义viewpager 三张图片在同一屏幕轮播的效果
github:https://github.com/nickeyCode/RoundImageViewPager 说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文 ...
- dedecms4张关键表解析之1
虽然dedecms默认共有87张表,但是只有4张最核心,最最要的表. 1.第一张表:dede_arctype 栏目表 dede设计者认为不管存放什么样的数据(文章,商品,电影)都应该属于某个栏目(类 ...
- 用SAXReader解析xml文档【转】
来源:http://blog.csdn.net/seayqrain/article/details/5024068 使用SAXReader需要导入dom4j-full.jar包. dom4j是一个Ja ...
- GIMP类似于PhotoShop的开源免费软件
首先我们先看看他的界面如何,都有哪些功能!而且它支持多种平台,可以在MacOS.Windows.Linux操作系统上使用.非常值得推荐! 1.官方地址下载地址: https://www.gimp. ...
- caioj 1082 动态规划入门(非常规DP6:火车票)
f[i]表示从起点到第i个车站的最小费用 f[i] = min(f[j] + dist(i, j)), j < i 动规中设置起点为0,其他为正无穷 (貌似不用开long long也可以) #i ...
- linux学习之高并发服务器篇(二)
高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...
- POJ——T 1988 Cube Stacking
http://poj.org/problem?id=1988 Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 25865 ...
- FZOJ 2176 easy problem ( 树链剖分 )
pid=2176" target="_blank">题目链接~~> 做题感悟:感觉做多了树链剖分的题目,有很多是树链剖分 + 想法.. 解题思路: 这题非常明 ...