以下内容为读《你不知道的JS》的读书笔记,在该书 1.2.3 节中讲到两个变量查询的方法,即 LHS 查询和 RHS 查询。书中的原话是“当变量出现在赋值操作的左侧时进行 LHS 查询,出现在右侧时进行 RHS 查询”。我的理解是,除了在赋值号(等号)左边的变量进行 LHS 查询外,所有需要访问变量的过程都是 RHS 查询。需要注意的是,在函数调用中,所传实参是一个隐式变量分配,属于 LHS 查询。

如下例,红色方框中的变量使用的是 LHS 查询,蓝色方框中的变量使用的是 RHS 查询

在清楚 LHS 查询和 RHS 查询后,我们来看看当变量未经声明时,JS引擎的处理,如下例

function foo(a) {console.log(a + b);b = a
}
foo(2);

【结果】在第一次对 b 进行 RHS 查询时,无法找到该变量,因此报错信息如下

虽然代码执行到这里报错,后面的内容不继续执行,但是要说明的是,当JS引擎在执行 LHS 查询时,如果在全局作用域中也找不到目标变量,就会在全局作用域中创建一个具有该名称的变量,并将其返还给引擎,前提是程序运行在非严格模式下。

将上述代码修改如下

function foo(a) {b = a;console.log('a + b = ', a + b);
}
foo(2);
console.log('b = ', b);

【结果】可以在全局作用域访问到 b

下面是我自己的一个点,没有什么技术含量

function foo(a) {console.log('a + b = ', a + b);        //b = undefinedvar b = a;
}
foo(2);

【结果】数 + undefined = NaN

原理_JS引擎对未声明变量的处理相关推荐

  1. JS 向未声明的变量分配值(可删除)

    如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性. 这条语句: carname="Volvo"; 将声明 window 的一个属性 carname. 非严 ...

  2. c++ 已声明变量提示未定义

    第一次崩溃的感受到vs2008是多么坑爹. 已声明变量,死活提示未定义. 心中一万匹草泥马往返奔腾了无数次 没办法,自己写个小demo,一个一个变量试. tnd,终于发现问题了. 就因为涉及到了str ...

  3. 变量“componentresourcemanager”未声明或从未赋值_频繁出现在面试题中,却容易被人遗忘:变量、基本数据类型...

    学习是个循序渐进的过程,厚积薄发,水滴石穿.有志同道合的朋友请关注. 变量 变量是java基础中的基础,但经常在面试题中出现.什么是变量?变量就是存数的,代词,指代的就是它所存的那个数. 1)声明 i ...

  4. c++: 已经声明过变量,依然报 C2065:未声明的标识符错误 解决办法

    问题:已经声明过变量,依然报 C2065:未声明的标识符错误 解决办法 问题分析:已经声明过变量,依旧报错未声明的标识符错误 (大家是不是很郁闷!!!),仔细观察两种情况的"=", ...

  5. Winform使用第三方库控件出现“NoLicenseInformation”或“变量未声明或从未赋值”问题总结

    背景 最近项目在浏览前人代码时,发现缺少对Infragistics的引用,于是便安装上了Infragistics库.最终还是报错"NoLicenseInformation"和&qu ...

  6. 【前端06_JS_ECMA 语法标准】声明变量、数据类型*、tupeof返回值、输入输出、运算、循环、条件、函数*、事件*

    JavaScript_ECMA 概述 ECMA 语法标准 声明变量 全局变量 注释方法 数据类型 * typeOf 能返回的值 * 输入与输出 运算 算数运算 赋值运算 关系运算 关系运算中的特殊题目 ...

  7. 浏览器原理-v8引擎-js执行原理

    浏览器原理-v8引擎-js执行原理 js简介 js应用: js的应用很广泛 可以应用于web,移动端,小程序,桌面应用,后端开发等 web开发包括(原生js,react,vue,angular等) 移 ...

  8. oracle存储过程、声明变量、for循环|转|

    oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...

  9. oracle存储过程、声明变量、for循环(转)

    oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...

最新文章

  1. 11年瑞纳手动挡值多少钱_三分钟让你知道手中的松石值多少钱
  2. SQL Server全局禁用及打开指定的跟踪标记
  3. U盘数据泄露,用不到30行的Python代码就能盗走
  4. Flutter 绘图 Paint strokeCap 延伸类型 strokeJoin 拐角类型 图文分析
  5. 贪心法解部分背包问题
  6. 【C++入门】C++ vector类
  7. cadence 617工艺库安装以及相关问题解决
  8. 连接网络要求输入计算机密码是什么,上网时总是提示需要输入网络密码什么原因...
  9. 文件或目录损坏其无法读取问题解决方法2022-9-15
  10. 基于Autoware制作高精地图(二)
  11. 基于多阈值的形态提取遥感图像中的沿海线的特征方法(Qu Jishuang)
  12. css3倒数两个,:nth-last-child()
  13. RecyclerView 结合cardview和materia degisn通过retrofit的一个项目,山寨it之家
  14. 笔记本 android,震惊:这个秘籍可以让笔记本同时拥有(mac/win/Android)系统
  15. 非苹果机安装 Mac OS X 全教程~~~~转
  16. 国内的镜像源访问地址
  17. 5分钟掌握初二物理下学期至初三部分重点知识点
  18. 物联网通信协议-MQTT及使用python实现
  19. 地质勘查土质分类图片_一种地质勘查用土壤样本采集装置的制作方法
  20. shell脚本之sed编辑器

热门文章

  1. TeamCity和GitLab整合
  2. 豆瓣9.8分,周志明的《凤凰架构》,高屋建瓴,推荐(送书)
  3. 如何正确、高效地阅读源代码?
  4. 学会查看 RabbitMQ日志
  5. LVS+Keepalived实现负载均衡和双机热备
  6. 音视频领域或将开启”外卷“之路
  7. 音视频技术开发周刊 | 192
  8. 确保HIPAA符合远程医疗视频流的2种方法
  9. Instagram视频上传延迟优化
  10. LeetCode——BFS