首页 新闻 会员 周边

关于js的作用域问题

0
悬赏园豆:10 [已解决问题] 解决于 2016-04-22 13:00


var name="global";
function foo(){
console.log(name);
}
function fooOuter1(){
var name="local";
foo();
}
fooOuter1();//输出global 而不是local,

__Construct的主页 __Construct | 初学一级 | 园豆:57
提问于:2016-03-24 18:11
< >
分享
最佳答案
-1

变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。

function foo(){
console.log(name);//name 是全局变量
} 

 

var name="global";
function foo(name){
console.log(name);
}
function fooOuter1(){
var name="local";
foo(name);//此时将局部local name传递进函数,则输出local
}
fooOuter1();//输出local

你是不是学习过C语言?或C++语言?

收获园豆:10
[0] | 小虾三级 |园豆:1257 | 2016-03-24 18:26

但在footOuter1() 不是有个name吗?

__Construct | 园豆:57 (初学一级) | 2016-03-24 18:28

@JerryMark: 理解第二段代码。

[0] | 园豆:1257 (小虾三级) | 2016-03-24 18:29

__Construct | 园豆:57 (初学一级) | 2016-03-24 18:29

@JerryMark: 

var name = 'global';

function foo() 
{
  console.log(name);
}

function fooOuter1() 
{
  name = 'local';//根据我的提示,这里我修改的什么?
  foo();
}

fooOuter1();
[0] | 园豆:1257 (小虾三级) | 2016-03-24 18:32

@[0]: 全局的

__Construct | 园豆:57 (初学一级) | 2016-03-24 18:33

@JerryMark: 

是的,这里是全局。

foo里面没有var 的name也是全局。

foo和fooOuter1都是同样的函数。

不要以为嵌套了,就改变了。理解那句话,就明白了。

[0] | 园豆:1257 (小虾三级) | 2016-03-24 18:35

@JerryMark: 

fooOuter1中使用了var的name是属于fooOuter1的局部变量,但它,不属于foo.所以foo的无var的name仍然是全局。

我描述的可以吗?

[0] | 园豆:1257 (小虾三级) | 2016-03-24 18:38

@[0]: 好的谢谢

__Construct | 园豆:57 (初学一级) | 2016-03-24 18:38

@JerryMark: 

给你找了一篇博文,再次深度理解一下吧。

[0] | 园豆:1257 (小虾三级) | 2016-03-24 18:46

@[0]: 真心感谢

__Construct | 园豆:57 (初学一级) | 2016-03-24 18:47

@JerryMark: 

文中的(2):(2)所有末定义直接赋值的变量自动声明为拥有全局作用域

就是我说的意思。

[0] | 园豆:1257 (小虾三级) | 2016-03-24 18:48
其他回答(2)
0

js 是基于词法作用域的,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,在你声明 foo 函数的时候 name 的作用域就已经决定了

by.Genesis | 园豆:2719 (老鸟四级) | 2016-04-22 11:23
0

 use strict

你就不会有这个困扰了。

Ropean | 园豆:121 (初学一级) | 2016-04-24 20:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册