Javascript 如何正确地确定聚合物延迟运行的功能范围?

Javascript 如何正确地确定聚合物延迟运行的功能范围?,javascript,polymer,delay,Javascript,Polymer,Delay,我试图将输入数据添加到一个数组中,该数组在最后一次击键后延迟了2秒。但是,当我运行此命令时,会出现以下错误:uncaughttypeerror:this.\u validateInput不是一个函数 我如何正确地定义这一点。\u validateInput()以延迟运行 我尝试了让func=this.\u validateInput(),但似乎每次设置func时都会运行该函数 此外,onchange输入处理程序仅在输入失去焦点时激发 正在寻找解决这个问题的方法 <paper-input i

我试图将输入数据添加到一个数组中,该数组在最后一次击键后延迟了2秒。但是,当我运行此命令时,会出现以下错误:
uncaughttypeerror:this.\u validateInput不是一个函数

我如何正确地定义
这一点。\u validateInput()
以延迟运行

我尝试了
让func=this.\u validateInput(),但似乎每次设置func时都会运行该函数

此外,onchange输入处理程序仅在输入失去焦点时激发

正在寻找解决这个问题的方法

<paper-input id="itemId" on-input="_autoAddToArray"></paper-input>
<paper-input id="itemId" on-input="_autoAddToArray"></paper-input>

this
关键字总是指当前作用域的
this
,当您在函数()中包装某些内容时,它会发生更改({…}

您需要将外部范围中的
this
分配给变量

var self = this;
timeout = setTimeout(function () {
  self._validateInput();
}, 2000);

Reference:

关键字
this
总是指当前作用域的
this
,当您在函数()中包装某些内容时,它会发生更改({…}

您需要将外部范围中的
this
分配给变量

var self = this;
timeout = setTimeout(function () {
  self._validateInput();
}, 2000);
参考资料:

使用lambda:

setTimeout(
    () => this._validateInput(),
    2000
);
或者绑定函数

setTimeout(this._validateInput.bind(this), 2000);
任何一种解决方案都应该有效


lambda之所以有效,是因为它没有自己的作用域。 绑定之所以有效,是因为它在运行它之前应用了作用域

setTimeout(
    () => this._validateInput(),
    2000
);
或者绑定函数

setTimeout(this._validateInput.bind(this), 2000);
任何一种解决方案都应该有效


lambda之所以有效,是因为它没有自己的作用域。

绑定之所以有效,是因为它在运行它之前应用了作用域,可以说,

哪里定义了
\u validateInput()
\u autoAddToArray
的级别相同。更新了问题以匹配…那么为什么要使用
此。\u validateInput()
。只要使用
\u validateInput()
我就得到了
未捕获的引用错误:\u validateInput未定义
当我尝试这样做时…你能分享fiddle吗
\u validateInput()
定义在哪里?与
\u autoAddToArray
的级别相同。更新了问题以匹配…那么为什么要使用
此。\u validateInput()
。只需使用
\u validateInput()
我得到
未捕获的引用错误:\u validateInput未定义
当我尝试时…你能分享Fiddle吗?你可能有一个打字错误,第一行末尾的点。另外,请注意,您还可以将
作为第三个参数传递,并将其作为回调中的参数,然后在其他名称下使用,例如
上下文
。另外,如果您对ES6的使用还满意,您可以在回调中使用箭头函数语法,因为
这个
没有绑定,所以您不会遇到这个问题。谢谢@mishu。我纠正了打字错误。将其作为第三个参数传递似乎在现代浏览器中起作用。但这项功能在旧浏览器中不可用。如果您想在基于聚合物的应用程序中支持Internet Explorer 9及以下版本,我猜setTimeout支持(可以用polyfill修补)是您的问题中最小的:)您可能有一个打字错误,第一行末尾的点。另外,请注意,您还可以将
作为第三个参数传递,并将其作为回调中的参数,然后在其他名称下使用,例如
上下文
。另外,如果您对ES6的使用还满意,您可以在回调中使用箭头函数语法,因为
这个
没有绑定,所以您不会遇到这个问题。谢谢@mishu。我纠正了打字错误。将其作为第三个参数传递似乎在现代浏览器中起作用。但这项功能在旧浏览器中不可用。如果您想在基于聚合物的应用程序中支持Internet Explorer 9及以下版本,我猜setTimeout支持(可以用polyfill修补)是您的问题中最小的:)您知道哪种方法的性能最好吗?将
this
设置为
self
似乎效率很低。我知道这是本机设置。没有开销。所以我不知道还有什么比这个更有效,因为它返回的是整个聚合物元素,比单个函数大得多。你知道哪种方法的性能最好吗?将
this
设置为
self
似乎效率很低。我知道这是本机设置。没有开销。所以我不知道还有什么比这个更有效,因为它返回整个聚合物元素,比单个函数大得多。