.length是对JavaScript数组的合适调用吗?
Is .length an appropriate call to a JavaScript array?
由于某些原因,我无法获得数组的长度(如果未填充则未定义,对吧?)
define(function() {
'use strict';
var self = {},
events = {};
self.publish = function publish(eventName, data) {
var subscribers, x, length;
if (events[eventName]) {
return false;
}
subscribers = events[eventName];
for (x = 0, length = subscribers.length || 0; x < length; x += 1) {
subscribers[x](data);
}
return true;
};
self.subscribe = function subscribe(eventName, func) {
if (!events[eventName]) {
events[eventName] = [];
}
events[eventName].push(func);
};
return self;
});
JSLint说:"期望';'而看到','。"TypeError: Cannot read property 'length' of undefined"
为什么长度不设为0?我是否误解了这里的语法和操作?
您在publish
函数中缺少一个否定:
self.publish = function publish(eventName, data) {
var subscribers, x, length;
if (events[eventName]) { // <= Here you exit if there are subscribers, and continue if there arent
return false;
}
subscribers = events[eventName]; // So subscribers is guaranteed to be undefined
// can't get length (or any property) of undefined
for (x = 0, length = subscribers.length || 0; x < length; x += 1) {
...
这会导致测试失败。应该这样做:
self.publish = function publish(eventName, data) {
// you can use const and let
// you are storing subscribers in a variable anyway, so why not doing it
// before the check?
const subscribers = events[eventName];
if (!subscribers) {
return false;
}
// you don't need to cache length in a variable, iirc it only improves performance slightly on IE browsers
// neither need you `|| 0`
// there other ways iterating through an array, see for..of and Array.prototype.forEach
for (let x = 0; x < subscribers.length; x++) {
subscribers[x](data);
}
return true;
};
如果没有填充,它是未定义的,对吧?
不,如果数组为空,则数组长度为零。当读取对象的缺失属性时,会得到一个未定义,但是数组的长度始终是一个数字。
我认为问题出在这一行:
for (x = 0, subscribers.length || 0; x < length; x += 1) {
你定义了变量"length",但是没有对它初始化/赋值。
在细节:subscribers.length || 0
这个应该做什么?
x < length
x < length or x < subscribers.length?
事实证明,当我修复了错字后,代码工作得很好。
if (events[eventName]) {
应该是
if (!events[eventName]) {
修正后一切都按预期进行。我的调试问题总是一些愚蠢的小问题
就像Don Bhrayan Singh说的
你的代码应该是for (var x = 0, length = subscribers.length || 0; x < length; x += 1) {
subscribers[x](data);
}
您之前的代码将像这样运行
// x = 0, 0 ; x < undefined; x += 1
for (x = 0, subscribers.length || 0; x < length; x += 1) {
subscribers[x](data);
}
相关文章:
- jqueryajax调用是复制url,当在模态视图之后在外部js文件中进行调用时
- 在 Javascript 中调用是同步的
- JavaScript:在调用之前将函数重新分配给局部变量,而不是直接调用并对'这'
- 我用诺言是对的吗
- 这些window.external调用是什么意思
- 在轨道上打印东西(字面意思是对打印机)
- jQuery:$.ajax() 重定向到其 URL 表单操作参数,而不是对表单操作执行 AJAX 请求
- MVC $.ajax 调用从不对编辑执行控制器操作,但在添加时有效
- 对一个类而不是对具有相同名称的所有类执行操作/函数
- 在输入字段中启用占位符,以便清空“在”用户输入之后,而不是对焦
- 在AngularJS中,一次进行两次调用是一种可接受的方法
- Heroku网站是对的,本地是错误的.如何在本地克隆我的英雄代码
- 谷歌的收件箱异步调用是如何工作的
- 这是对 eval() 的不良用法吗?
- 什么是对列表重新排序进行动画处理.js反应友好方式
- .prepend() 结果对每个人都是可见的,而不仅仅是对执行操作的人
- 对象 javascript 语法是对还是错
- 如何判断一个JavaScript变量是否是对另一个变量的引用
- AngularJS Accordion是对函数的开放调用
- .length是对JavaScript数组的合适调用吗?