两个相似函数之间的区别,为什么一个有效而另一个无效
Difference between two similar functions, why is one working and the other not
我有两个函数,一个有效,另一个无效。
它们是相等的,除了一个循环遍历一个变量,其中保存了范围的全局对象(希望这是有意义的),另一个尝试直接遍历文本,但失败了,因为它抛出了错误:
Uncaught TypeError: Cannot read property '0' of undefined
这是小提琴:
http://jsfiddle.net/4p1p4wjy/2/
在我的理解中,该函数的第二个版本不起作用,因为它不知何故无法访问this.splittedText
,从函数的回调中。
第一个工作功能:
loopThroughSplittedText: function() {
// delete this
var locationInString = 0;
var splittedText = this.splittedText;
function delayedOutput() {
document.getElementById('output').innerHTML = splittedText[locationInString];
locationInString++;
if(locationInString < splittedText.length) {
setTimeout(delayedOutput, 200);
}
}
delayedOutput();
},
第二个不工作功能:
loopThroughSplittedTextNotWorking: function() {
// delete this
var locationInString = 0;
function delayedOutput() {
document.getElementById('output').innerHTML = this.splittedText[locationInString];
locationInString++;
if(locationInString < this.splittedText.length) {
setTimeout(delayedOutput, 200);
}
}
delayedOutput();
}
如何在不先将对象保存在局部变量中的情况下使第二个函数工作?我想尽可能使用双向数据绑定。
如何在不先将对象保存在局部变量中的情况下使第二个函数工作?
你不能。 this
是一个变量,它始终是使用它的函数的局部变量,其值取决于函数的调用方式。如果要在不同的函数中使用它的值,则需要将其复制到另一个变量中。
bind
方法提供了执行此操作的简写。
setTimeout(delayedOutput.bind(this), 200);
简单的答案,你没有。由于您的函数是通过超时调用的,因此它不再位于同一上下文中,并且"this"将不再引用同一对象。
您可以这样做:
loopThroughSplittedTextNotWorking: function() {
// delete this
var locationInString = 0;
var that = this;
function delayedOutput() {
document.getElementById('output').innerHTML = that.splittedText[locationInString];
locationInString++;
if(locationInString < that.splittedText.length) {
setTimeout(delayedOutput, 200);
}
}
delayedOutput();
}
通过将"this"变量保存到局部变量中,您可以在"delayedOutput"函数中访问它。
我意识到这基本上就像你的工作示例一样,只是措辞有点不同,但通常这就是我的做法。
相关文章:
- JSON.parse给了我一个错误,但JSONLint说它'是一个有效的json
- 是什么让新的Date() / 1000成为一个有效的javascript
- 这是一个有效的JS代码吗
- 多个弹出窗口,但只有一个有效..为什么?
- Jquery - 相同的代码,但只有一个有效
- RxJS:如何在传递下一个有效值之前进行一些清理
- 这是一个有效的 XPath 查询吗?
- 在 JavaScript 中,数组如何引用到空字符串 + true 中是一个有效字符
- 两个相同的键控事件;只有一个有效
- JavaScript 方法一个有效,另一个无效
- 如何使用NightwatchJS从下拉列表中选择一个有效的随机值
- 将 Base64 编码的图像加密为另一个有效的 Base64 编码图像
- 使用 Javascript 构造一个有效的 JSON 对象
- 我有一个有效的 JSON,但我不断收到“语法错误 json.parse 第 1 行意外的数据结尾”
- 这是一个有效的递归函数吗
- 有人能告诉我为什么其中一个有效,另一个无效吗
- 在Rails助手中使用Javascript调用验证文本字段时,如何返回最后一个有效输入
- Undefined不是一个有效的uri或options对象.在expressjs
- 我如何检查一个字符串是否会使用JS使一个有效的html ID
- 函数从字符串创建一个有效的id.正则表达式