JavaScript中变量的范围是什么?

javascript中变量的范围是什么? 它们在函数内部和外部的做用域是否相同? 仍是有关系吗? 另外,若是变量是全局定义的,这些变量将存储在哪里? javascript


#1楼

据我了解,关键是Javascript具备功能级别范围,而不是更常见的C块范围。 html

这是一篇关于该主题的好文章。 java


#2楼

我发现许多不熟悉JavaScript的人都难以理解,继承默认状况下是该语言可用的,而且函数做用域是迄今为止惟一的做用域。 我提供了我去年年末写的名为JSPretty的美化工具的扩展。 要素颜色在代码中做用域,而且始终将颜色与该做用域中声明的全部变量关联。 当一个颜色的变量来自一个范围时,在另外一个范围中使用可视化的方式显示了闭包。 git

请尝试如下功能: github

观看演示: chrome

在如下位置查看代码: 安全

当前,该功能支持深度16个嵌套函数,但当前不为全局变量着色。 闭包


#3楼

试试这个奇怪的例子。 在下面的示例中,若是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());

#4楼

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! 对已经定义的名称稍加注意将使此操做更加安全。 所以,我我的将永远不会使用。


#5楼

全球范围:

全局变量就像全局明星同样(成龙,纳尔逊·曼德拉)。 您能够从应用程序的任何部分访问它们(获取或设置值)。 全局功能就像全局事件(新年,圣诞节)。 您能够从应用程序的任何部分执行(调用)它们。

//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

查看本文以深刻了解范围

相关文章
相关标签/搜索