var a = 10;
function aaa() {
alert(a);
}
function bbb() {
var a = 20;
aaa();
}
bbb();//10
为什么答案是10,不是20?
千言万语汇成一句话:作用域在函数定义时就已经确定了。而不是在函数调用时确定 详情可参考http://www.cnblogs.com/wangfupeng1988/p/3991995.html
不知道在哪里看到过,js的变量作用域只有2个,全局,function内,所以2个function是隔离的
你调用的aaa()这个函数时,他的就是a= 10,所以,输出10
楼主你好,
function bbb() {
var a = 20;
aaa();
},你已经重新在bbb()方法里面定义了一个变量为var a=20的局部变量,外部的Var a=10;是一个全局的变量,
如果你想得到值为20.
请改为如下:
你在试试!
我就是想问为什么啊?
@猪猪侠女: 两个变量都不是一个。一个是局部变量一个是全局变量,你变量名称不要取得一样。
其实这个问题很好解释,
// *** 想输出20的话得这样 var a = 10; function aaa() { alert(a); } function bbb() { a = 20; aaa(); } bbb();//20
你的代码之所以运行是输出10, 是因为第一个"var a = 10"作用域大于第二个"var a = 20", 第二个"var a = 20"其实并不会覆盖第一个"var a = 10", 因为第一个"var a = 10"的作用域大于后者,如果想输出20,就按上面代码改一下, 另外, javascript是弱类型语言, 所以才可以这么些, 如果是强类型语言,如果已知全局变量已有某变量, 是不允许再声明一个这样的变量的。
我不明白的地方就是,函数aaa()在函数bbb()中被调用,为什么跟aaa()在全局中被调用是一样的?就是说,当函数aaa()在函数bbb()中被调用,为什么aaa()中的a的指的还是全局中的a,而不是bbb()中的a?
@猪猪侠女: 因为全局的a作用于大于局部的a, 所以无论在任何地方声明a, 只要有全局的。局部的都是会被全局覆盖的。换而言之, 内存中如果已经有全局的变量a,局部的变量a想再声明内存中就没有位置了。只可以赋值, 而不能单独给局部的a开一个位置、
@猪猪侠女: 如果有问题继续追问, 没问题的话就采纳吧, 在线等你!
@请叫我头头哥:
var a = 10;
function bbb() {
var a = 20;
(function aaa() {
alert(a);//20
})();
}
bbb();
那你又怎解释这个呢?