浏览 4061 次
锁定老帖子 主题:经典论坛的javascript小小考题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-17
最后修改:2008-11-21
<script> function foo(){ foo.abc = function(){alert('def')} this.abc = function(){alert('xyz')} abc = function(){alert('@@@@@')}; var abc = function(){alert('$$$$$$')} } foo.prototype.abc = function(){alert('456');} foo.abc = function(){alert('123');} var f = new foo(); f.abc(); foo.abc(); abc(); </script> 请尽量不执行,试着直接给出结果并给出理由。 这道题可以帮你温习很多内容(对象、类、原型、作用域、优先级等等),同时部分朋友也能学到很多知识。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-17
随后一行abc();是不是有问题啊?
|
|
返回顶楼 | |
发表时间:2008-11-17
最初我以为执行结果应该如下:
var f = new foo(); f.abc(); // alert('xyz'); foo.abc(); // alert('def'); abc(); // alert('@@@@@'); 结果在 firefox 中测试发现最后一句 abc() 是错误的 仔细一想才恍然,原来在一个函数中,会预先给 var 关键字定义的局部变量“分配空间”,所以一进入 foo 函数体的时候 abc 已经视为一个局部变量,虽然 abc = function(){alert('@@@@@')}; 这行看起来像是定义了一个全局变量,但它还是局部变量。所以在函数体外调用 abc() 理所当然的失败 呵呵,这样的题目挺有意思 |
|
返回顶楼 | |
发表时间:2008-11-18
看早就看过这个题目,一直都不知道为什么啊!可以解释一下吗?
|
|
返回顶楼 | |
发表时间:2008-11-18
foo.prototype.abc = function(){alert('456');}
foo.abc = function(){alert('123');} 为什么不会覆盖foo里面的方法啊! abc = function(){alert('@@@@@')}; var abc = function(){alert('$$$$$$')} 这两句,我明白,不用考虑 |
|
返回顶楼 | |
发表时间:2008-11-18
如此不规范的脚本语言,鄙视
|
|
返回顶楼 | |
发表时间:2008-11-21
最后修改:2008-11-21
var f = new foo(); //新建了一个foo对象,注意这时个上下文环境到了foo()中
f.abc(); //查找这个对象的abc()方法,输出xyz, 注意如果找不到就会去f.prototype里找,到那时才会输出456 foo.abc(); //在foo()中找到abc()方法,输出def, 如果找不到会跳出foo() 到外面找到abc ,输出123 abc(); //在window中找到abc()方法, ie抛错 |
|
返回顶楼 | |
发表时间:2008-12-01
tidus 写道 var f = new foo(); //新建了一个foo对象,注意这时个上下文环境到了foo()中
f.abc(); //查找这个对象的abc()方法,输出xyz, 注意如果找不到就会去f.prototype里找,到那时才会输出456 foo.abc(); //在foo()中找到abc()方法,输出def, 如果找不到会跳出foo() 到外面找到abc ,输出123 abc(); //在window中找到abc()方法, ie抛错 我不知道我这样理解可以不 abc = function(){alert('@@@@@')}; var abc = function(){alert('$$$$$$')} 是内部声明,外部不可以访问 对foo来说内部的高于外部的 所以先考虑 foo.abc = function(){alert('def')} this.abc = function(){alert('xyz')} 然后考虑 foo.prototype.abc = function(){alert('456');} foo.abc = function(){alert('123');} |
|
返回顶楼 | |
发表时间:2008-12-01
tidus 写道 foo.abc(); //在foo()中找到abc()方法,输出def, 如果找不到会跳出foo() 到外面找到abc ,输出123 我认为是因为在执行new foo() 时对foo.abc进行了重写导致的输出def,如果没有这一句,那么在foo(){}后面写的那句话就能起作用。 |
|
返回顶楼 | |