var name="global";
function foo(){
console.log(name);
}
function fooOuter1(){
var name="local";
foo();
}
fooOuter1();//输出global 而不是local,
变量在函数内没有声明(没有使用 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++语言?
但在footOuter1() 不是有个name吗?
@JerryMark: 理解第二段代码。
恩
@JerryMark:
var name = 'global'; function foo() { console.log(name); } function fooOuter1() { name = 'local';//根据我的提示,这里我修改的什么? foo(); } fooOuter1();
@[0]: 全局的
@JerryMark:
是的,这里是全局。
foo里面没有var 的name也是全局。
foo和fooOuter1都是同样的函数。
不要以为嵌套了,就改变了。理解那句话,就明白了。
@JerryMark:
fooOuter1中使用了var的name是属于fooOuter1的局部变量,但它,不属于foo.所以foo的无var的name仍然是全局。
我描述的可以吗?
@[0]: 好的谢谢
@JerryMark:
给你找了一篇博文,再次深度理解一下吧。
@[0]: 真心感谢
@JerryMark:
文中的(2):(2)所有末定义直接赋值的变量自动声明为拥有全局作用域
就是我说的意思。
js 是基于词法作用域的,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,在你声明 foo 函数的时候 name 的作用域就已经决定了
use strict
你就不会有这个困扰了。