javascript中变量的范围是什么? 它们在函数内部和外部的做用域是否相同? 仍是有关系吗? 另外,若是变量是全局定义的,这些变量将存储在哪里? javascript
据我了解,关键是Javascript具备功能级别范围,而不是更常见的C块范围。 html
这是一篇关于该主题的好文章。 java
我发现许多不熟悉JavaScript的人都难以理解,继承默认状况下是该语言可用的,而且函数做用域是迄今为止惟一的做用域。 我提供了我去年年末写的名为JSPretty的美化工具的扩展。 要素颜色在代码中做用域,而且始终将颜色与该做用域中声明的全部变量关联。 当一个颜色的变量来自一个范围时,在另外一个范围中使用可视化的方式显示了闭包。 git
请尝试如下功能: github
观看演示: chrome
在如下位置查看代码: 安全
当前,该功能支持深度16个嵌套函数,但当前不为全局变量着色。 闭包
试试这个奇怪的例子。 在下面的示例中,若是a是一个初始化为0的数字,则将看到0,而后是1。除了a是一个对象,而且javascript会将f的指针(而不是其副本)传递给f1。 结果是您两次都收到相同的警报。 jsp
var a = new Date(); function f1(b) { b.setDate(b.getDate()+1); alert(b.getDate()); } f1(a); alert(a.getDate());
1)有一个全局范围,一个功能范围以及with和catch范围。 一般,变量没有“块”级做用域-with和catch语句将名称添加到其块中。 函数
2)做用域一直由函数嵌套到全局做用域。
3)经过原型链解决属性。 with语句将对象属性名称带到with块定义的词法范围内。
编辑:ECMAAScript 6(Harmony)被指定为支持let,我知道chrome容许使用“ harmony”标志,所以也许它确实支持它。
让咱们为块级做用域提供支持,可是您必须使用关键字来实现它。
编辑:基于本杰明在评论中指出with和catch语句,我已经编辑了帖子,并添加了更多内容。 with和catch语句都将变量引入其各自的块中,这就是块做用域。 这些变量是传递给它们的对象的属性的别名。
//chrome (v8) var a = { 'test1':'test1val' } test1 // error not defined with (a) { var test1 = 'replaced' } test1 // undefined a // a.test1 = 'replaced'
编辑:澄清示例:
test1的做用域为with块,但别名为a.test1。 “ Var test1”在上层词法上下文(函数或全局)中建立一个新变量test1,除非它是-的属性。
kes! 当心使用'with'-就像var是noop,若是变量已经在函数中定义,就从对象导入的名称而言,它也是noop! 对已经定义的名称稍加注意将使此操做更加安全。 所以,我我的将永远不会使用。
全局变量就像全局明星同样(成龙,纳尔逊·曼德拉)。 您能够从应用程序的任何部分访问它们(获取或设置值)。 全局功能就像全局事件(新年,圣诞节)。 您能够从应用程序的任何部分执行(调用)它们。
//global variable var a = 2; //global function function b(){ console.log(a); //access global variable }
若是您在美国,可能会认识臭名昭著的名人金·卡戴珊(Kim Kardashian)(她设法制做了小报)。 可是美国之外的人不会认出她。 她是当地的明星,必定会进入她的领土。
局部变量就像局部恒星。 您只能在范围内访问它们(获取或设置值)。 局部函数就像局部事件-您只能在该范围内执行(庆祝)。 若是要从范围以外访问它们,则会获得参考错误
function b(){ var d = 21; //local variable console.log(d); function dog(){ console.log(a); } dog(); //execute local function } console.log(d); //ReferenceError: dddddd is not defined