请看一下这个方法作用域的问题.

2014-02-10 23:39:44 +08:00
 jacob
下面这段代码执行是o is undefined错误。我想应该是作用域的关系,因为去掉外部立即执行函数的包裹,就可以执行。但是我好奇,o.m()的调用和o的定义明明都在同一个函数里面,怎么会无法访问呢?

// $(function ( ) {
// var o;
// o= {
// v:0,
// m:function () {
// alert("hello");
// }
// };


// setInterval("o.m()",1000);
// });



为什么改成 //setInterval( function( ) { o.m(); } , 1000);
又可以执行了呢。谢谢
3040 次点击
所在节点    JavaScript
10 条回复
dorentus
2014-02-10 23:42:38 +08:00
window.setInterval 第一个参数用字符串的话,估计是运行到的时候才 eval 的吧,谁知道它那时用的是哪的作用域(或许是全局?)……
tinyhill
2014-02-10 23:49:52 +08:00
$(function () {
var o;
o = {
v: 0,
m: function () {
alert("hello");
}
};
window.o = o;
setInterval("o.m()", 1000);
});
qq286735628
2014-02-10 23:53:15 +08:00
$(function ( ) {
var o;
o= {
v:0,
m:function () {
alert("hello");
}
};
setInterval(o.m,1000);
});
jacob
2014-02-10 23:53:35 +08:00
@dorentus
你提醒我了,不用字符串做参数,直接用函数或者方法的引用就行了。setInterval(o.m,1000);但还是不知道为什么用字符串和函数做参数
jacob
2014-02-10 23:56:53 +08:00
@tinyhill 可否详细说明下这个问题?
jacob
2014-02-10 23:57:33 +08:00
@qq286735628 我提交后看到你的回复了- -
tinyhill
2014-02-10 23:57:55 +08:00
@jacob 函数做参数就是单纯调用;字符串做参数相当于 eval 一次,执行上下文是 window;
dorentus
2014-02-11 00:03:30 +08:00
如果你想问什么时候用字符串、什么时候用函数的话,那么答案是:「永远都只用函数」。

----
稍微长点的答案是:「当然,setInterval 的第一个参数当然可以用字符串、eval 也并非一无是处,不过仅仅在你知道你在做什么的时候、并且你完全确定你要这么做的时候,才用它们」。

----
参见:
1) https://developer.mozilla.org/en-US/docs/Web/API/Window.setInterval
2) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
yimity
2014-02-11 07:45:29 +08:00
tinyhill 回答的对。
ksc010
2014-02-11 09:06:59 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/99641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX