做用域:一个变量能够生效的范围。 变量不是在全部地方均可以使用的,而这个变量的使用范围就是咱们要说的做用域。浏览器
注意:在JavaScript中,划分做用域也是用大括号划分的, 可是在 JS 之中可以有效限定做用域的大括号只有函数大括号!函数
学习使用做用域,如下内容是所须要了解的:学习
请看下面示例代码:spa
1 var a = 10; 2 console.log(a); // 输出结果: 10 3 function foo(){ 4 console.log(a); // 输出结果: 10 5 } 6 foo()
当变量 a 声明时,没有被函数大括号包裹, 那么这个变量咱们称之为 全局变量设计
这个全局变量在任何地方均可以访问。code
一样的,如下内容也是所须要了解的:blog
请看下面示例代码:生命周期
1 function foo(){ 2 var a = 10; //在大括号之中声明的变量只能在这个大括号之中使用; 3 console.log(a); // 输出结果: 10 4 } 5 foo(); 6 console.log(a); // 报错 => ReferenceError: a is not defined
经过上面示例代码能够看出:ip
在函数大括号之中声明的变量,这种变量咱们称之为 局部变量 !内存
局部变量只能在声明它的做用域之中使用;
注意!这是一个不规范的声明方式!不要使用!不要使用!不用使用!
使用以后致使的结果就是:一个局部变量的声明,在全局中也能够被访问了!( 这样的声明叫作 伪全局变量 )
请看下面示例代码:
1 function foo(){ 2 a = 10; // 此时声明变量 a 没有使用var关键字声明 3 console.log(a); // 10 4 } 5 foo(); 6 console.log(a); // 输出 10,不报错了;
看完上面的代码示例,你是否是以为这不挺好的嘛,变量 a 能够随便使用,都不用报错了,为何不让使用??
呵呵,别高兴太早,继续往下看,你的这个想法很危险的!
你会发现:
是否是脑子里忽然蹦出了好多问题:生命周期是什么鬼?命名空间又是什么鬼??
好吧,上面这个内容我说早了,那么接着往下看:
在这里就来聊一下上面的生命周期和命名空间吧!
就是你啥时候能够访问!
致使的结果就是会让程序变得更重! 若是可能,仍是少设计一点全局变量吧!对你们都好
如今知道啥是生命周期了吧,全局变量多了,可能真的会影响到咱们程序的运行效率,上面说的伪全局变量就是这个道理。
咱们看完了生命周期,再来一块儿看一下命名空间吧!
咱们先来举一个小例子,话很少说上代码:
1 var count = 10; 2 function foo(){ 3 // 个人代码 : 个人私人领域; 4 // 程序的懒惰原则:函数的大括号之中若是已经有了查找结果,那么就不会继续再查找了; 5 // 就近原则; 6 var count = 0; 7 console.log(count); // 运行结果:0 8 } 9 foo(); 10 console.log(count); // 运行结果:10
为了解决全局之中的命名空间是惟一的这个问题,咱们能够把这个变量放在局部,那么就不会占用全局的命名空间了。
最后一个问题:我如今要写一大坨代码,和别人的代码要配合 。 这个时候咋写呢???
我能够把代码写在一个没有名字的函数之中! 什么?这样写直接报错 ?
JS为啥阻止他 ? 若是我当即调用呢!来一个瞒天过海如何?
让匿名函数经历一次运算: 若是函数发生了特定的运算, 那么这个函数就会被当作一个地址;
1 // 让匿名函数经历一次运算: 若是函数发生了特定的运算,那么这个函数就会被当作一个地址; 2 // var res = 1 + function(){} 3 // console.log(res); //运行结果:1function(){} 4 5 // 利用这个机制使用匿名函数当即调用 : 6 // +function(){ 7 // console.log("hello world") 8 // }(); 9 10 // 函数通过运算变成了地址,被后面的调用运算符调用了; 11 // !function(){ 12 // console.log("hello world") 13 // }(); 14 15 // 一种广泛的写法 : 16 17 // (function(){ 18 // console.log("hello world1"); 19 // })() 20 // 可能存在的bug; 21 // (function(){ 22 // console.log("hello world1"); 23 // })(); 24 // //两个匿名函数同时是使用必定要加上分号 25 // (function(){ 26 // console.log("hello world2"); 27 // })(); 28 // 建议写法; 29 ;(function(){ 30 console.log("hello world1"); 31 })();
一、全局不能访问局部
二、局部能够拿到全局
喜欢的朋友能够点点关注,点点赞,欢迎评论区留言互动。