将一个函数命名为对象中属性的值的目的是什么?
What is the purpose of naming a function that is a value of a property in an object?
var timers = { //#1
timerID: 0, //#2
timers: [], //#2
add: function(fn) { //#3
this.timers.push(fn);
},
start: function runNext() { //#4
if (this.timerID) return;
(function() {
if (timers.timers.length > 0) {
for (var i = 0; i < timers.timers.length; i++) {
if (timers.timers[i]() === false) {
timers.timers.splice(i,1);
i--;
}
}
timers.timerID = setTimeout(runNext, 0);
}
})();
},
上面的代码来自John Resig的Secrets of The JavaScript Ninja。我不明白的是他给start
赋了一个函数,然后把这个函数命名为runNext
。有人能解释一下吗? 函数的"name"还有一个特殊的作用,在FunctionExpression1:
中使用时特别有用。x = function theFunc (z) {
// theFunc is in scope here, and so can be used to refer
// to the function itself in a recursive manner
// (in the posted code it is used with setTimeout)
return z > 0 ? theFunc(z - 1) * z : 1;
};
// theFunc is NOT in scope here in valid ECMAScript; IE quirks anyone?
与x
不同的是,上述theFunc
总是表示特定的函数对象。如果没有这个名称,则需要一个额外的闭包(或使用this
管道)来递归访问该函数。此外,紧密绑定使theFunc
独立于当前的this
绑定,这可能是好的,也可能是坏的-请注意,在调用setTimeout
之后,theFunc
将在不同的绑定上下文中被调用(这也使this.timerID
的使用受到怀疑)。在ECMAScript第三版中,然后是函数名(标识符)和参数。Callee将计算为作用域中相同的函数对象。然而,参数。calllee在ECMAScript第5版"strict"模式下无效。
名称也可能出现在堆栈跟踪,toString()
和name
/displayName
(如实现)。
1From ES5 Annotated, Function Declarations:
FunctionExpression中的Identifier可以从FunctionExpression的FunctionBody内部引用,以允许函数递归地调用自己。
在JavaScript中,任何东西都是带有成员的对象,这些成员可以作为属性或方法,这取决于你在其中放入了什么。
在这种情况下,timer
将有一些成员用作方法(add
和start
)。为了做到这一点,它们将包含对function
代码的引用。他给start
(runNext
)中的代码引用命名的唯一原因是他可以从内部递归地再次调用该函数。您在runNext
中看到的第二个函数引用是另一个匿名函数引用,它甚至没有被分配给任何东西,但它只是在那里使它在那一刻为runNext
返回一些东西。
相关文章:
- 鼠标悬停的属性数据是什么
- 为Google闭包类定义属性的首选方式是什么
- 在jquery中,从同一对象的属性设置输入字段和标签的正确方法是什么
- 单击TextArea'时,文本区域中的属性名称是什么;s上下箭头按钮
- 根据DOM,HTML元素的开始和结束标记之间的内容被称为属性.这个房产的名字是什么
- InDesign CS5 / Extendscript -- exportFile 的参数是什么,它的相关属性是什么
- 函数对象的名称属性是什么
- Internet Explorer 10 - (Javascript 或 jQuery) 如何在不知道属性和属性是什么类
- 窗口背后的原因和窗口的顶部属性是什么
- Chrome应用程序API中webview标记的分区属性是什么
- “未捕获的TypeError: Cannot read”属性是什么?JS误差均值
- Javascript中的构造函数属性是什么?
- Javascript中使用的Infinity属性是什么?
- 在主干视图中使用tagName, id和className属性是什么?而我们可以用el来访问dom元素
- 在JS数组上使用对象属性是什么?它是否符合标准
- 当你不知道属性是什么的时候,有没有办法在javascript中干净地使用隐藏类?
- 如果被窗口打开,新窗口的属性是什么?打开功能
- 作为 element.contains() 的参数输入的有效属性是什么
- tinymce的addButton()函数中所有可能的设置属性是什么?
- 函数、数组和对象构造函数的长度属性是什么?