首页 新闻 会员 周边 捐助

js函数内调用别的函数时的作用域是怎样的?

0
悬赏园豆:10 [已解决问题] 解决于 2015-05-20 10:21

var a = 10;

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

为什么答案是10,不是20?

猪猪侠女的主页 猪猪侠女 | 初学一级 | 园豆:193
提问于:2015-05-19 16:11
< >
分享
最佳答案
1

千言万语汇成一句话:作用域在函数定义时就已经确定了。而不是在函数调用时确定 详情可参考http://www.cnblogs.com/wangfupeng1988/p/3991995.html

收获园豆:5
隔壁老王来了 | 初学一级 |园豆:99 | 2015-05-20 10:07
其他回答(4)
0

不知道在哪里看到过,js的变量作用域只有2个,全局,function内,所以2个function是隔离的

吴瑞祥 | 园豆:29449 (高人七级) | 2015-05-19 16:23
0

你调用的aaa()这个函数时,他的就是a= 10,所以,输出10

wangYiYi | 园豆:13 (初学一级) | 2015-05-19 16:36
0

楼主你好,

function bbb() {
var a = 20;
aaa();
},你已经重新在bbb()方法里面定义了一个变量为var a=20的局部变量,外部的Var a=10;是一个全局的变量,

如果你想得到值为20.

请改为如下:

 

你在试试!

 

 

想要飞 | 园豆:11 (初学一级) | 2015-05-19 16:53

我就是想问为什么啊?

支持(0) 反对(0) 猪猪侠女 | 园豆:193 (初学一级) | 2015-05-19 18:04

@猪猪侠女: 两个变量都不是一个。一个是局部变量一个是全局变量,你变量名称不要取得一样。

支持(0) 反对(0) 想要飞 | 园豆:11 (初学一级) | 2015-05-19 18:05
0

 其实这个问题很好解释,

// *** 想输出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是弱类型语言, 所以才可以这么些, 如果是强类型语言,如果已知全局变量已有某变量, 是不允许再声明一个这样的变量的。

收获园豆:5
请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-19 18:06

我不明白的地方就是,函数aaa()在函数bbb()中被调用,为什么跟aaa()在全局中被调用是一样的?就是说,当函数aaa()在函数bbb()中被调用,为什么aaa()中的a的指的还是全局中的a,而不是bbb()中的a?

支持(0) 反对(0) 猪猪侠女 | 园豆:193 (初学一级) | 2015-05-19 18:38

@猪猪侠女: 因为全局的a作用于大于局部的a, 所以无论在任何地方声明a, 只要有全局的。局部的都是会被全局覆盖的。换而言之, 内存中如果已经有全局的变量a,局部的变量a想再声明内存中就没有位置了。只可以赋值, 而不能单独给局部的a开一个位置、

支持(0) 反对(1) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-19 19:17

@猪猪侠女: 如果有问题继续追问, 没问题的话就采纳吧, 在线等你!

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-19 19:17

@请叫我头头哥: 

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

那你又怎解释这个呢?

支持(0) 反对(0) 猪猪侠女 | 园豆:193 (初学一级) | 2015-05-19 19:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册