gpt4 book ai didi

javascript - 为什么这两个 JavaScript 函数不等价?

转载 作者:行者123 更新时间:2023-11-28 12:21:26 25 4
gpt4 key购买 nike

此功能有效:

function refreshCodeMirror(){
$("textarea").each(function(){
var codeMirror = $(this).data('codeMirror');
setTimeout(function(codeMirror){
return function () {
codeMirror.refresh();
}
}(codeMirror), 10)

});
}

但是当我尝试将其简化为:

function refreshCodeMirror(){
$("textarea").each(function(){
var codeMirror = $(this).data('codeMirror');
setTimeout(codeMirror.refresh, 10)

});
}

简化不起作用。

一些(可能不相关的)上下文:

refreshCodeMirror 函数在 django 模板内的 Bootstrap 选项卡标题的 onclick 中被调用:

   <div class="row">
<div class="col-md-12">
<ul class="nav nav-tabs" role="tablist">
{% for field in form_tab_fields %}
<li role="presentation"{% if forloop.first %} class="active"{% endif %}>
<a class="tab-header" href="#{{ field.id_for_label }}_tab" data-toggle="tab" onclick="refreshCodeMirror()">{{ field.label_tag }}</a>
</li>
{% endfor %}
</ul>
<div class="tab-content">
{% for field in form_tab_fields %}
<div role="tabpanel"
class="form-group tab-pane{% if forloop.first %} active{% endif %}"
id="{{ field.id_for_label }}_tab">
{{ field }}
{{ field.errors }}
</div>
{% endfor %}
</div>
</div>
</div>

上面的第一个函数一切正常,虽然我想删除所有多余的刷新调用,但它们似乎并不重要,当我使用单个文本区域(通过传递元素 id)时,工作上面的功能停止工作。

最佳答案

问题是你失去了上下文。

未直接在对象上调用且未手动绑定(bind)到上下文的函数在全局上下文中调用。

var obj = {
print: function() {
document.write('<pre>' + this + '</pre>');
}
};

obj.print();
var p = obj.print;
p();

当您使用setTimeout或其他类似函数时,就像这样做:

function setTimeout(f, time) {
wait(time);
f();
}

因此,您的 refresh 函数期望 this 等于您的 codeMirror 实例,但它等于 windowundefined(取决于您是否处于严格模式)。

有几种方法可以解决这个问题。一种是将新函数传递给 setTimeout,您可以在其中调用原始函数。

setTimeout(function() {
codeMirror.refresh();
}, 10);

另一种方式,使用bind将函数的副本传递给它,并将 this 设置为正确的对象。

setTimeout(codeMirror.refresh.bind(codeMirror), 10);

关于javascript - 为什么这两个 JavaScript 函数不等价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37262818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com