作用域
在JS中,函数嵌套是非常普遍的,在函数嵌套中:对变量是如何寻找的?
答: 首先在函数内寻找,寻找不到,则在外层寻找 ...直到..全局(window)区域。
    // 例子1var c=5;function t1() {var d=6;function t2() {var e=7;alert(c+d+e);  //18}t2();}t1();
    // 例子2var c=5;function t1() {var d=6;function t2() {var e=7;var d=3;alert(c+d+e);  //15}t2();}t1();

对var的理解:

var的作用:声明变量。 var 是在函数运行的上下文中声明一个变量。如果不加var 仅仅是一个赋值操作 但不要狭隘地理解为声明了一个变量。

    alert(window.d);  //undefined ------->window全局中没有d变量alert(window.e);  //undefinedfunction t() {d=5;             //------------>变量不加var 仅仅是一个赋值操作var e=6;}t();alert(window.d);   //5alert(window.e);   //undefined
    function t1() {var d;function t2() {d=5;   //---->仅仅是一个赋值操作e=6;}t2();}t1();console.log(window.e);    //  6console.log(window.d);    //  undefinedconsole.log(d);   //Uncaught ReferenceError: d is not defined
注意:以window.xxx引用全局变量,如果寻找不到,是作为某个属性不存在 返回undefined
如果直接以xxx引用全局变量 如果找不到 则会报错:Uncaught ReferenceError: xxx is not defined

作用域考试:这是一个极容易出错 但是有很基础的JS面试题

    // 例子1// =============================================var str1='global';function t1() {console.log(str1);  //globalconsole.log(str2);   //Uncaught ReferenceError: str2 is not definedstr2='local';}t1();
分析:  console.log(str1)执行时,在t1内寻找str1找不到 于是往外找,在window上寻找到str1  打印global;
console.log(str2)执行时,在t1内寻找str2找不到 于是往外找 在window寻找str2 没有 于是报str2 is not defined错误
至于str2='local',根本执行不到这里
    // 例子2// ==================================================var str1='global';function t1() {console.log(str1);  //globalconsole.log(str2);   //undefinedvar str2='local';}t1();
以下该知识点非常重要!**********
JS代码的执行自上而下没有问题
但是JS代码在整理运行分为:
词法分析期和运行期
自上而下执行之前,先有一个“词法分析过程”!
以上面例2为例:
第1步:先分析t1函数  t1内部有局部变量str2  注意此时只是有分析出来,代码还没运行,函数未执行 故还没有赋值
第2步:执行t1函数console.log(str1);  //globalconsole.log(str2);   //undefinedvar str2='local';  此时str2的值为local因此光知道作用域链的概念还不够,还要知道词法分析

燕十八老师 JS高级学习笔记 之作用域链相关推荐

  1. 燕十八老师JS高级之词法分析笔记

    词法分析 分析什么? 按顺序3样东西 1.先分析参数 2.再分析变量声明 3.分析函数声明 一个函数能使用的局部变量,就从上面的3步分析而来 具体步骤: 1.在函数运行的前的瞬间,会生成Active ...

  2. 燕十八PHP公益课堂学习笔记

    <?php /**** 燕十八 公益PHP讲堂论 坛: http://www.zixue.it 微 博: http://weibo.com/Yshiba YY频道: 88354001 ****/ ...

  3. 燕十八ajax笔记,燕十八php視频教程笔记(PHP基础部分).doc

    燕十八php視频教程笔记(PHP基础部分) 001-开学典礼 002-变量概念及命名规范 <?php //?$a?是钥匙[107房间],?房间里的内容是值, /* echo?$a,?什么过程? ...

  4. 学习笔记1..燕十八老师公益课堂

    2019独角兽企业重金招聘Python工程师标准>>> 1:show create table thread的结果 2:.php文件中,的 set names 信息. 3:网页的me ...

  5. JS高级——函数执行、作用域链内存结构图

    一.JavaScript的执行过程 假如我们有下面一段代码,它在JavaScript中是如何被执行的呢? 1.1 第一步:初始化全局对象 js引擎会在执行代码之前,会在堆内存中创建一个全局对象:Glo ...

  6. 燕十八老师高级JS之this详解 学习笔记

    JS中的this到底是谁? JS非常灵活 PHP中指的是当前对象 JS中函数的四种调用方式 1.作为普通的函数来调用时 this的值 指向window,准确地说 this为NULL 但被解释成wind ...

  7. 燕十八老师高级JS之arguments详解

    arguments是什么? 答:是1个对象 是一个长的很很像数组的对象 arguments内容是什么? 答:是函数运行时的实参列表 (function (d,e,f){console.log(argu ...

  8. 燕十八mysql笔记_学习笔记2..燕十八老师公益课堂

    mysql_insert_id 返回表中auto_increment列刚刚产生的最大值,插入后要立即调用该函数,否则 可能得到意外的结果 表中必须有auto_increment列才能调用,否则只返回0 ...

  9. MySQL燕十八老师课程笔记:第十六课:MySQL各个函数

    # 在给商品打八八折的基础上抹掉零头 select goods_id,goods_name,floor(shop_price*0.88) from goods where cat_id=4; # 给每 ...

最新文章

  1. REM+SVG Sprite,web app案例
  2. Poj(1703),种类并查集
  3. webService——学习(3):使用JDK开发webService
  4. 八.利用springAMQP实现异步消息队列的日志管理
  5. C++ decltype关键字
  6. 计算机道德 英语作文,公共道德英语作文
  7. android sdk版本升级,个推 Android SDK 老版本升级2.9.+
  8. java实现复原IP地址,回溯算法:复原IP地址
  9. 【习题 7-2 UVA-225】Golygons
  10. 克罗谈投资策略04_感觉与现实
  11. 静态文件用什么服务器配置,静态文件服务器路径怎么配置好
  12. ong拼音汉字_汉语拼音ang-ong(教案)
  13. coreldraw x5安装视频教程_免费史上最全的EndNote视频教程
  14. 爬取斗鱼主播名字和热度
  15. 拍乐云携手UCloud,共建云的美好时代
  16. [TIM] 微信登录TIM生产QQ号【并独立使用】
  17. oracle查看列属性,oracle查询列属性
  18. 三菱plc pwm指令_三菱电机PLC学习:高速指令
  19. 【06月04日】A股滚动市盈率PE历史新低排名
  20. 微型计算机海关编码是,海关HS编码对照表..doc

热门文章

  1. 协作图(Collaboration Diagram)
  2. 计算机医学英语论文,医学英语论文.doc
  3. 邮件协议POP3/IMAP/SMTP介绍
  4. 我一名cisco培训讲师,我也谈点体会
  5. KiCad安装第三方插件方法
  6. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
  7. table 表格细线条实现方式
  8. mysql数据库的字符集设置_mysql数据库的字符集设置
  9. 4部网页配色电子书库之第2部——颜色英文名称查询表
  10. U盘刻录后如何恢复原来容量大小[windows下] - 转