首页 > web前端 > js教程 > 正文

JavaScript中的变量查找

PHPz
发布: 2017-04-04 10:30:14
原创
2264人浏览过

总所周知,javascript变量是按照作用域链来进行查找的(作用域和作用域链相关知识可参看我的另一篇文章,《基于javascript作用域链的性能调优》), 那么,对于一个简单的赋值操作,等号左右两边变量的查找方式一样吗?让我们从一个简单例子讲起~

console.log(a);   // undefined
var a = 3;
console.log(a);   // 3

console.log(b);  // ReferenceError
b = 4;
console.log(b);  //4
登录后复制

1. LHS(left-hand-side左查找)和RHS(right-hand-side右查找)

概念如下:

  • LHS查询:试图找到变量容器本身,从而可以对其进行赋值

  • RHS查询:查找某个变量的值

对于一个赋值语句var a = b;,等号左侧进行LHS查询,等号右侧进行RHS查询;如果是一个普通的打印语句console.log(a),那么,查找变量a属于RHS查询。

立即学习Java免费学习笔记(深入)”;

两者的相同之处:都遵循作用域链查找

2. LHS和RHS查询区别

(1) LHS查询
当JavaScript引擎执行LHS查询时,如果在顶层作用域中无法找到目标变量,那么,就会在全局作用域中创建一个具有该名称的变量,并将其返回给引擎(非严格模式下)。

要注意,这种方式创建的全局变量,严格上来讲并不是真正的变量,而是全局对象属性,可以通过<a href="http://www.php.cn/wiki/1298.html" target="_blank">delete</a>操作符将其删除。但是,用var声明的全局变量,是不可以用delete操作符删除的。

参考文章首部的例子:

b = 4;
console.log(b);  // 4
delete b;
console.log(window.b); // undefined
登录后复制

程序中并没有声明变量b,但是由于LHS查询会自动创建未找到的目标变量,所以,打印b返回4。然后删除b,可删除成功。

如果是严格模式:

"use strict";
b = 4;
console.log(b);
登录后复制

这时LHS查询将无法自动创建未声明的目标变量,所以,打印b变量0:Uncaught ReferenceError: b is not defined

商汤商量
商汤商量

商汤科技研发的AI对话工具,商量商量,都能解决。

商汤商量 36
查看详情 商汤商量

(2) RHS查询
当JavaScript引擎执行RHS查询时,如果在作用域链中都无法找到目标变量,那么,引擎会抛出ReferenceError异常。

参考文章首部的例子:

console.log(b);  
b = 4;
登录后复制

RHS查询变量b,在全局作用域中未曾找到该变量定义,于是,引擎抛出异常Uncaught ReferenceError: b is not defined

3. 小贴士

(1) 变量提升
概念:用var声明的变量,总是会被JavaScript解释器悄悄地“提升”到方法体的最顶部。

参考文首的例子:

console.log(a); 
var a = 3;
登录后复制

JavaScript引擎会将其解析为:

var a = undefined;
console.log(a); 
a = 3;
登录后复制

所以,第一次打印a时会返回undefined

(2) ReferenceError和TypeError
ReferenceError代表作用域判别失败,也就是作用域内查询变量失败。
TypeError代表作用域判别成功,但是对结果的操作是非法或者不合理的。

例如:

foo();
var foo = function () {
     console.log('a');
}
登录后复制

执行foo()语句时,首先RHS查找,在全局作用域中找到foo变量,值为undefined(变量提升)。
然后以变量1执行方式操作foo变量,很明显,undefined并不是一个合法函数,于是引擎抛出异常:Uncaught TypeError: foo is not a function,执行失败。

以上就是JavaScript中的变量查找的详细内容,更多请关注php中文网其它相关文章!

相关标签:
java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号