js作用域和作用链

js中函数嵌套是非常普遍的,那么子啊函数嵌套中,变量时怎么寻找的?

答:首先在内层中寻找,找不到的话就跑的外层寻找,

……直到跑到window顶层(全局)为止

——————————————————————————————

声明变量时加var和不加var的区别,

答:加var才是声明变量。不加的话是赋值操作(不要狭隘的理解为声明了一个全局变量),会在函数内部找变量,找不到往上层找,还没有的话找到window,并赋值。

  js中 允许在定义变量的时候 不加var 修饰符。
-》不加var 修饰符。js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存。当且将其视为window的成员。 也就是全局变量。
-》如果加了var 修饰符。 js会重新为这个变量分配内存,不论当前上下文中是否已经定义过了。这个变量的作用域就为当前上下文。 即局部变量。

 1 <script type="text/javascript">
 2
 3 function t1() {
 4     var d;
 5
 6     function t2() {
 7         d = 5;
 8         e = 6;
 9     }
10
11     t2();
12 }
13
14
15 t1();
16
17 console.log(e); // 6
18 console.log(d); // d is not defined错误
19 console.log(window.d); // undefined
20
21 /*
22 注意:
23 以window.xxx引用全局变量,寻找不到,做为某个属性不存在,返回undefined
24 直接以xxx引用某命题,寻找不到,则是报xxx is not defined错误
25 */
 1 <script type="text/javascript">
 2
 3 /*
 4 作用域考试
 5
 6 注:这是一个极容易出错,又极基础的JS面试题
 7 */
 8
 9
10 /*
11 var str1 = ‘global‘;
12
13 function  t1() {
14     console.log(str1);
15     console.log(str2);
16
17     str2 = ‘local‘;
18 }
19
20 t1();
21
22
23
24 常见的3种答案
25 global , local
26 global , undefined
27 global , str2 is not defined错误
28
29 分析:
30
31 19行执行, 在t1内寻找str1--没有,又在window上寻找str1,有. 打印global
32 20行执行, 在t1内寻找str2--没有,又在window上寻找str2,没有. 报str2 is not defined错误
33 22行: (实际上出错,没执行到这一些)  才把全局的str2变量赋上值
34 */
35
36
37 var str1 = ‘global‘;
38
39 function  t1() {
40     console.log(str1);
41     console.log(str2);
42
43     var str2 = ‘local‘;
44 }
45
46 t1();   // global undefined
47
48 /*
49 解释:
50
51 js代码自上而下执行!
52
53 但是----------
54 js代码在整体运行分:
55
56 词法分析期
57 运行期
58
59 自上而下执行之前 , 先有一个"词法分析过程"!
60
61
62 此上面的结果为例:
63
64
65 1步:分析t1函数
66
67 t1{
68 var str2    // 分析出 t1内有str2局部变量. 注意此时函数未执行,因此str2的值是undefined
69 }
70
71 2步: 执行t1函数
72     console.log(str1);   // global
73     console.log(str2);   // undefined
74     str2 = ‘local‘;  // 此时,str2的值为local
75
76 */
77
78
79 /*
80
81 词法分析是我们的一个重点
82
83 */
84
85
86
87
88 </script>
时间: 2024-12-29 11:16:23

js作用域和作用链的相关文章

JS 作用域、原型链

看到一道好题,并附答案 function Foo() { getName = function () { console.log('1'); }; return this; } Foo.getName = function () { console.log('2'); }; Foo.prototype.getName = function () { console.log('3'); }; var getName = function () { console.log('4'); }; func

JavaScript函数之作用域 / 作用链域 / 预解析

关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ ------------------------------------------------------------------------------------------------------------------------------------------- 作用域 js中作用域只有一种,就是函

js作用域

function t() { console.log(str); /*此时内部已经有了AO对象 undefined*/ var str="local"; /*执行到此的时候如果AO对象没有赋值就赋值*/ console.log(str) } t() /*函数作用域是在声明的时候决定的而不是在执行的时候决定的作用域链 作用域 t保护 p 外层作用域windows 作用链 p没有去t找.t没有去windows找 函数作用域在函数申明的时候决定 二,词法分析 函数执行前,会进行预编译,这个就

【动画演示】:JS 作用域链不在话下

作者:Lydia Hallie译者:前端小智来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料.欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西. 本篇我们来看看啥是作用域以及作用域链,首先,来看看下面的代码: const name = "Lydia" const age = 21 const city = "San Fr

JS作用域链

Js作用域与执行环境: 1. 作用域链: <1>用途:保证对执行环境有权访问的所有变量和函数的有序访问. <2>构成: a.作用域链的前端,始终都是当前执行代码所在环境的变量对象(如果这个环境是函数,则将其活动对象作为变量对象,活动对象在最开始时只包含一个变量,即arguments对象): b.下一个变量对象来自包含(外部)环境: c.最后一个对象,为全局执行环境的变量对象. <3>标识符解析:是沿着作用域链一级一级地搜索标识符的过程,始终从作用域链的前端开始,然后逐级

了解 JS 作用域与作用域链

(1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域. 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(function scope),属于局部变量 局部变量优先级高于全局变量 var name="one"; function test(){ var name="two"; console.log

谈谈我对JS作用域的理解

Javascript语言在设计之初,就将函数设计成一种包含可执行代码逻辑的特殊对象.作为对象,函数可以像普通对象变量一样拥有可以编程读写的属性,也可以像普通变量一样传递.被引用.但是问题也来了,当函数执行时,解释器如何对代码内部的标示符进行解析呢?JS是这样做的,当函数对象被创建时,或者说函数被定义时,函数对象内部不仅包含了代码逻辑,还定义了一个内部属性[[Scope]]引用了一条作用域链(可以理解成为一个对象列表).如果这个函数在全局环境下被定义,那这个作用域链里就只有全局作用域. 这样说比较

JavaScript-作用域和作用链

一 在JS中,函数也是对象,所有的都是对象,函数对象和其它对象一样,拥有通过代码进行访问和一系列通过JS引擎访问的属性 二. 作用链:作用域中对象的集合,他决定了哪些数据可以被函数访问 **************************** var test=function() //块极作用域 { if(1+1==2){ var str="JS中没有块极作用域,所以str是可以调用的"; } console.log(str); } test(); //JS中没有块极作用域,所以st

关于js作用域

我们知道在编程语言中,作用域的作用就是控制变量.参数的可见范围和生命周期. js中提供了函数作用域的功效,比如在函数中定义的变量外部是无法访问到的: function jsFunc(){ var a = 5; } alert(a); // undefined 但是js中却没有提供块作用域的功效,比如我们在java代码中如果些如下代码: public static Boolean b = false; public static void main(String[] args) { if(!b){