一、在ES5中,js 的作用域

js作用域,只有全局作用域与函数作用域,没有块级作用域。

1、全局作用域


var a = 10;
function aaa() {
alert(a)
} function bbb(){
var a=20;
aaa()
} bbb(); //

a =10 是全局的  而a=20 是局部的

2、变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。

var a=10
function aaa(){
alert(a);
var a=20
} aaa(); // undefined,一是预解析,二是就近查找。
var a = 10
function aaa(){
alert(a)
a=20
}
aaa(); //

这个虽然是就近原则,但是就近找var声明的变量,因为a= 20  没有var声明,只是修改了a 的值,所以到外面去找了,输出的是10。不过没错的是a=20后,a确实为20了,只不过alert的时候还没有执行到那~~

var a = 10
function aaa(){
a=20
alert(a)
}
aaa(); //

3、全局作用域与函数作用域:

var a=10
function aaa(){
bbb();
alert(a);
function bbb(){
var a=20
}
}
aaa(); //

4、当参数跟局部变量重名时,优先级是等同的。

var a=10;
function aaa(a){
alert(a)
var a= 20;
}
aaa(a) // 10

js 中传参时,基本类型传值,引用类型传引用。

 var a = 5;
var b=a;
b +=3
alert(a); //
var a = [1,2,3]
var b=a;
b = [1,2,3,4];
alert(a); //[1,2,3]
var a = [1,2,3]
var b=a;
b.push(4);
alert(a); //[1,2,3,4]

参数与变量一样也是有作用域:

var a=10;
function aaa(a){
a +=3
}
aaa(a)
alert(a) // 10
var a=10;
function aaa(a){
a +=3
alert(a)
}
aaa(a)
// 13

var a= [1,2,3]
function aaa(a){
a=[1,2,3,4]
}
aaa(a)
alert(a) // 1,2,3
var a= [1,2,3]
function aaa(a){
a.push(4)
}
aaa(a)
alert(a) // 1,2,3,4
 

二、es6 中,块级作用域

块作用域由{ }包括,if语句和for语句里面的{ }也属于块作用域。

1、块作用域,var的变量外部是可以访问的。

{
var a= 1;
console.log(a) //
} console.log (a) // ( function A() {
var b=2;
console.log(b) //
}) (); console.log(b); //报错 if(true){
var c=3
} console.log(c) //

2、 var 、 let 、 const 区别

var定义的变量,没有块的概念,可以垮块访问,不能跨函数访问;

let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问;

const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。

<script type="text/javascript">
// 块作用域
{
var a = 1;
let b = 2;
const c = 3;
// c = 4; // 报错
var aa;
let bb;
// const cc; // 报错
console.log(a); //
console.log(b); //
console.log(c); //
console.log(aa); // undefined
console.log(bb); // undefined
}
console.log(a); //
// console.log(b); // 报错
// console.log(c); // 报错 // 函数作用域
(function A() {
var d = 5;
let e = 6;
const f = 7;
console.log(d); //
console.log(e); // 6 (在同一个{ }中,也属于同一个块,可以正常访问到)
console.log(f); // 7 (在同一个{ }中,也属于同一个块,可以正常访问到) })();
// console.log(d); // 报错
// console.log(e); // 报错
// console.log(f); // 报错
</script>

最新文章

  1. Idea 实时编译 和 热部署
  2. MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子
  3. centos7 安装mysql5.7.11注意事项
  4. 为Apache配置虚拟机Virtual Host
  5. 【Struts2学习笔记-3】常量配置
  6. 九 AIDL
  7. 10 Technologies That will Shape Future Education--reference
  8. Cable master(好题,二分)
  9. jQuery.Autocomplete实现自动完成功能-搜索提示功能
  10. Python是如何实现生成器的原理
  11. Web从入门到放弃&lt;2&gt;
  12. 【如何使用jQuery】【jQuery弹出框】【jQuery对div进行操作】【jQuery对class,id,type的操作】【jquery选择器】
  13. flink入门
  14. PCL深度图像(1)
  15. Vue.js2 + Laravel5 采用 CORS 方式解决 AJAX 跨域的问题
  16. HTTPS 数字签名 证书
  17. url基础知识
  18. centos7.3下apache搭建django[未成功]
  19. Golang之并发资源竞争(读写锁)
  20. 安装xml2js出现npm ERR! code E404 npm ERR! 404 Not Found: event-stream@3.3.6

热门文章

  1. (转)python装饰器二
  2. bbed初体验
  3. 性能测试脚本开发(C&amp;C#&amp;Java)
  4. 搭建rocketMq环境
  5. 解释一下Windows dos中的符号
  6. 使用jquey的css()方法改变样式,
  7. oled屏幕
  8. 浅谈js中的MVC
  9. NightWatchJS(转)
  10. c# emit 实现类的代理