为什么console.log在这段代码中返回undefined ?
Why console.log in this code return undefined?
var el = $('.container');
var anchors = new Array('jobs', 'portfolio', 'docs', 'interier', 'price');
for (var i = 0; i < anchors.length; i++) {
el.on('click', 'a[href$="#'+anchors[i]+'"]', function (e) {
e.preventDefault();
console.log(anchors[i]);
$.scrollTo('a[name="'+anchors[i]+'"]');
});
};
当您单击该元素时,i
的值将增加到anchors.length
的值。
你的点击处理程序有一个对i
的引用。
JavaScript中无法解析的属性查找返回undefined
。
使用this
作为元素的引用会容易得多。否则,找到一种方法通过值传递i
的值,而不是直接引用它。
未定义的原因是i
实际上等于5
。看看这个:
for ( var i = 0; i < 5; i++ ) {
console.log( i );
}
现在,在这个循环完成后,你会认为i
在这个时间点上是未定义的,因为它应该是for
循环的局部值。不幸的是,事实并非如此。一个简单的测试方法:
for ( var i = 0; i < 5; i++ ) {
console.log( i );
}
console.log( i ) // Logs out 5;
简单地说,for循环的i++
在真值测试部分(i < 5
位)之后执行。因此,当i
等于4
时,循环运行,然后它被i++
加1,这将i
的值设置为5,从而使真值测试失败。
那么现在你知道i
等于5
,当你在anchors
数组中查找时,anchors[5]
是未定义的。
这很重要的原因是每次触发click事件时,它将执行i
的缓存值5,并且反过来,您将始终记录未定义
i
的值创建一个别名,如下所示
var el = $('.container');
var anchors = new Array('jobs', 'portfolio', 'docs', 'interier', 'price');
for (var i = 0; i < anchors.length; i++) {
// By passing the value to this self executing function,
// it creates a new instance of the variable
( function ( index ) {
el.on('click', 'a[href$="#'+anchors[index]+'"]', function (e) {
e.preventDefault();
console.log(anchors[index]);
$.scrollTo('a[name="'+anchors[index]+'"]');
});
})( i );
};
变量i
获得上次循环的值。如果你想访问锚,你可以使用:
console.log($(this).attr('href').substr(1));
相关文章:
- 为什么这个代码返回NaN
- 为什么这两段代码返回的值不同
- 为什么此代码返回未定义的4次而不是数组值
- php代码返回基于数组的值
- 代码返回上次刷新前的最新值,而不是插入的最新的值
- ajax 代码返回 ProgressEvent 对象而不是我的模板数据
- 此 Javascript 代码返回“Undefined”
- 为什么这个 JavaScript 地板数学代码返回 nan
- 使用我自己的服务器解析云代码返回“未经授权”
- PHP 代码返回其脚本,在 JQuery Ajax 中不起作用
- Kohana - 使用“.exec”正则表达式发布javascript代码返回内部错误
- Codecademy - 我的代码返回 true,但它说我错过了其他东西
- 如何将window.baseUrl从剃刀代码返回到我的外部.js文件中
- 谷歌分析代码返回'未定义函数“;错误
- 为什么此代码返回未定义
- 通过ajax和外接程序表将表行作为HTML代码返回
- 从PHP代码返回的JSON字符串填充下拉列表
- 为什么这个javascript代码返回undefined
- 为什么不't此代码返回完整的文档高度
- 为什么我的代码返回ReferenceError:茶是没有定义,当我选择茶