大神们看看你能答对这个题嘛

kis龍 2013-03-03 09:32:22
var a = 10;
function test() {
a = 100;
alert(a+'.1');
alert(this.a+'.2');
var a;
alert(a+'.3');
}
test();



var tt = 'aa';
function test(){
alert(tt+'.4');
var tt = 'dd';
alert(tt+'.5');
}
test();

前面2个相信大家也许可以答对,
但是这个呢?
var a = 10;
function test() {
a = 100;
alert(a+'.1');
alert(this.a+'.2');
var a;
alert(a+'.3');
}
test();
//这里是分界线
var a = 'aa';
function test(){
alert(a+'.4');
var a = 'dd';
alert(a+'.5');
}
test();

我果断被自己给坑了,alert 弹出几次,结果是什么?
...全文
472 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kis龍 2013-03-07
  • 打赏
  • 举报
回复
引用 11 楼 qq378527566 的回复:
引用 10 楼 p270228163 的回复:引用 4 楼 p270228163 的回复:引用 2 楼 tiangong789 的回复:同意楼上的见解我也是那么理解的 加一遍运行应该也不会改变其结果 你可以试试,会alert 4次而不是 5次 那个我知道函数会覆盖, 1.函数以最后一个为准,(如果参数不一样呢,函数可以重载吗) 2.声明的一个变量都会分配内存,知道……
受教了
yibuyisheng 2013-03-07
  • 打赏
  • 举报
回复
不错,很给力,强化了一下在function与中变量的声明与变量的赋值
qq378527566 2013-03-06
  • 打赏
  • 举报
回复
引用 10 楼 p270228163 的回复:
引用 4 楼 p270228163 的回复:引用 2 楼 tiangong789 的回复:同意楼上的见解我也是那么理解的 加一遍运行应该也不会改变其结果 你可以试试,会alert 4次而不是 5次 那个我知道函数会覆盖, 1.函数以最后一个为准,(如果参数不一样呢,函数可以重载吗) 2.声明的一个变量都会分配内存,知道赋值了才会alert出结果,否则都是undef……
1、js没有重载,变量名只是对函数的引用,所以当定义一个函数a时,相当于把内存中的函数赋值给变量a;如果再次定义一个函数a,则相当于给a重新赋值。也就是说,a只可能指向一个函数,不会重载的。 2、这个是变量作用域的问题,变量的声明会在编译的时候就确定下来,如果在赋值之前就使用变量,因为在函数作用域就能找到一个未赋值的变量,就不会到更上层的作用域去查找变量了。不过由于该变量没有赋值,所以alert出来的是undefined。 3、不要搞错了this的含义。this代表的是调用这个函数的对象。如果没有别的对象调用,比如有函数fun,类似fun()的调用,因为没有调用对象,默认是window,所以此时this就是window;但如果这样调用,比如a.fun()此时this就等于a了。同时有些调用可以改变this的指向,比如fun.apply(c,args),此时的this就是第一个参数c。
kis龍 2013-03-06
  • 打赏
  • 举报
回复
引用 4 楼 p270228163 的回复:
引用 2 楼 tiangong789 的回复:同意楼上的见解我也是那么理解的 加一遍运行应该也不会改变其结果 你可以试试,会alert 4次而不是 5次
那个我知道函数会覆盖, 1.函数以最后一个为准,(如果参数不一样呢,函数可以重载吗) 2.声明的一个变量都会分配内存,知道赋值了才会alert出结果,否则都是undefined 3.作用域的,函数内函数外有同名变量,函数内未赋值前都是undefined,要想访问函数外变量得用this 如 this.a 不知道有没有错误,有错误请大神指出来! ^_^
cllover 2013-03-06
  • 打赏
  • 举报
回复
学习了.不是说定义边玲如果不用var则这个变量就是window的变量的么 函数内部的a如果没定义应该去查找环境(window)的变量啊
lin11211408 2013-03-04
  • 打赏
  • 举报
回复
函数定义的优先级是最高的,所以在解释的时候先把所有定义解释了放到内存里,再去执行,同名函数,以最后一个为准
未知数 2013-03-04
  • 打赏
  • 举报
回复
其实这种问题不管怎么变化,只要记住 同一片作用域下,相同的变量名就是同一个变量,理解了这个,这种作用域问题根本不是问题了,那两段代码,不管分开执行,一起执行,按照句话去理解都可以得出正确答案
tiangong789 2013-03-04
  • 打赏
  • 举报
回复
只会调用最后的那个test()当然是两次*2次的alert了
未知数 2013-03-04
  • 打赏
  • 举报
回复
引用 4 楼 p270228163 的回复:
引用 2 楼 tiangong789 的回复:同意楼上的见解我也是那么理解的 加一遍运行应该也不会改变其结果 你可以试试,会alert 4次而不是 5次
对你的书写方式表示无语 你说的四次是把两个函数放在一起吧,那样前面一个当然被覆盖了,就是四次 我奇怪的是既然你的意思是放在同一个页面运行,那在两个函数中写一句"//这里是分界线"来做什么?
kis龍 2013-03-04
  • 打赏
  • 举报
回复
引用 2 楼 tiangong789 的回复:
同意楼上的见解我也是那么理解的 加一遍运行应该也不会改变其结果
你可以试试,会alert 4次而不是 5次
kis龍 2013-03-04
  • 打赏
  • 举报
回复
引用 1 楼 wzs_xyz 的回复:
主要是作用域问题 var a = 10; function test() { a = 100; alert(a+'.1'); alert(this.a+'.2'); var a; alert(a+'.3'); } test(); 这儿只需记住同一片作用域里面a变量是同一个变量,一旦函数内定义了局部变量a……
你错了,这个是在一个js文件里面的,alert的次数是4粗而不是5次,我看的一个csdn的帖子看到真的着个测试,结果我放到一块,然后结果,不是2个分开的结果,而是其中一个, 过两天我把这个总结一下,昨天看了(别的大婶的解释).还没有验证是不是正确,
tiangong789 2013-03-04
  • 打赏
  • 举报
回复
同意楼上的见解我也是那么理解的 加一遍运行应该也不会改变其结果
x372563572 2013-03-04
  • 打赏
  • 举报
回复
引用 8 楼 lin11211408 的回复:
函数定义的优先级是最高的,所以在解释的时候先把所有定义解释了放到内存里,再去执行,同名函数,以最后一个为准
+1
未知数 2013-03-03
  • 打赏
  • 举报
回复
主要是作用域问题 var a = 10; function test() { a = 100; alert(a+'.1'); alert(this.a+'.2'); var a; alert(a+'.3'); } test(); 这儿只需记住同一片作用域里面a变量是同一个变量,一旦函数内定义了局部变量a,函数内所有a就都是这个局部变量a,函数内this为window,所以this.a会访问到全局变量a,故依次为100.1,10.2,100.3 var a = 'aa'; function test(){ alert(a+'.4'); var a = 'dd'; alert(a+'.5'); } test(); 与上原理同,定义a后函数内的a都是同一个 第一处还未赋值,为undefined,该值与字符串相加没试过,应该是弹出undefined.4,第二处不用说dd.5

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧