var part = "global";
function checkvariable()
{
document.write(part);
document.write("sf");
}
checkvariable(); //输出global var part = "globa";
function checkvariable()
{
alert(part);
var part = "local";
document.write(part);
}
checkvariable();
为什么输出是两次 undefined和local。恳求详细解释一下javascript 作用域
function checkvariable()
{
document.write(part);
document.write("sf");
}
checkvariable(); //输出global var part = "globa";
function checkvariable()
{
alert(part);
var part = "local";
document.write(part);
}
checkvariable();
为什么输出是两次 undefined和local。恳求详细解释一下javascript 作用域
{
alert(part);
var part = "local";
document.write(part);
}在javascript中是先执行 var部分,再执行别的,所以这里的alert(part);指向的是内部对象part而不是全局对象part
同一片作用域相同的变量就是同一个变量(不用管该变量定义在什么位置定义了几次)
还有,一般来说,只有函数又单独作用域,像if,for,switch什么的都没有独立作用域的
正是因为执行顺序导至alert是undefined
你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
比如:
var p = 1;
function test(){
if(false) {
var p;
}
p = 2;
}
test();
alert(p);
看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
正是因为执行顺序导至alert是undefined
你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
比如:
var p = 1;
function test(){
if(false) {
var p;
}
p = 2;
}
test();
alert(p);
看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
正是因为执行顺序导至alert是undefined
你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
比如:
var p = 1;
function test(){
if(false) {
var p;
}
p = 2;
}
test();
alert(p);
看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
你写清楚哪儿输出了undefined,还有不要用document.write来输出,用alert或console.log
正是因为执行顺序导至alert是undefined
你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
比如:
var p = 1;
function test(){
if(false) {
var p;
}
p = 2;
}
test();
alert(p);
看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
你写清楚哪儿输出了undefined,还有不要用document.write来输出,用alert或console.log
呵呵,其实上面那段程序(全部),放在js标签里执行不报错。具体输出是1:弹框undefined,浏览器上显示了一个local;2:再次弹出undefined,浏览器上追加了一个local。我就想知道这其中的原因,是第二次函数定义覆盖了第一次还是怎么回事。从c的角度解释不通,本人原来学c.
function checkvariable()
{
alert(part);//第一次输出undefinded 在上面我已经解释清楚了
var part = "local";//这里重新定义了part
document.write(part);//这里输出local
}
checkvariable();
所以第一次输出undefinded 第二次输出local。
还有 不要在script里用两个同名函数
function checkvariable()
{
alert(part);//第一次输出undefinded 在上面我已经解释清楚了
var part = "local";//这里重新定义了part
document.write(part);//这里输出local
}
checkvariable();
所以第一次输出undefinded 第二次输出local。
还有 不要在script里用两个同名函数
我贴的代码就在上面,不要断章取义,一叶障目不见森林啊亲。我要的就是定义同名函数,因为不报错,所以想看是什么原因。进而窥测其运行机制。
正是因为执行顺序导至alert是undefined
你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
比如:
var p = 1;
function test(){
if(false) {
var p;
}
p = 2;
}
test();
alert(p);
看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
你写清楚哪儿输出了undefined,还有不要用document.write来输出,用alert或console.log
呵呵,其实上面那段程序(全部),放在js标签里执行不报错。具体输出是1:弹框undefined,浏览器上显示了一个local;2:再次弹出undefined,浏览器上追加了一个local。我就想知道这其中的原因,是第二次函数定义覆盖了第一次还是怎么回事。从c的角度解释不通,本人原来学c.
是的,function(){}方式既是函数定义又是赋值,所以会提前执行
如果放到两个不同script标签中因为标签加载先后前面一个可以执行
放到同一个标签中则是后面一个覆盖前一个
至于机制这种东西,不好明确,很多时候看浏览器:
if(true) {
function test(){
alert(1);
}
} else {
function test(){
alert(2);
}
}
test();
大部分浏览器会输出2,火狐输出1;机制自己去想吧
你看mozilla 里关于function一些 说明
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Functions