【问题标题】:How does Javascript(NodeJS) handle scope and context with regard to events [duplicate]Javascript(NodeJS)如何处理与事件有关的范围和上下文[重复]
【发布时间】:2016-06-28 17:00:22
【问题描述】:

我有点困惑,
给定示例代码,我在其中加载了几个 url,并连接了事件监听器:

var pages= Array();
var loading= Array();

for(i=0; i < urls.length; i++){
var page =new WebPage(urls[i]);

   page.onLoadStarted = function() {
       loading[i]= true;
       console.log('Loading started');
   };    
   pages[i]=page;

}

我有 5 个 url,我在控制台输出中得到 5 次“加载开始”,但是加载数组只有一个值定义(真),其余的都是“未定义”; 看起来当事件被触发时loading[i]= true; 使用 I 的最后一个值来访问数组而不是使用它的地址。我该如何解决?

我尝试向页面对象添加属性,但同样的事情发生了;

这是我尝试过的:

var pages= Array();

for(i=0; i < urls.length; i++){
var page =new WebPage(urls[i]);

   page.onLoadStarted = function() {
       page.loading= true;
       console.log('Loading started');
   };    
   pages[i]=page;

}

【问题讨论】:

  • 如果不能依赖 ES2015,只需使用 for(let i=0;...) 或将事件处理程序包装在 IIFE 中

标签: javascript node.js scope event-handling dom-events


【解决方案1】:

如果onLoadStarted 是一个事件处理程序,那么for 循环的执行速度要比所有事件处理程序快得多。在那个时候 i5 并且在每个函数调用期间,数组的第六个索引填充了一个 true 值。由于数组的较低索引没有任何设定值,因此您会得到这样的输出。

一种选择是使用Array.prototype.forEachArray.prototype.map 方法。这两个函数都将一个函数作为处理程序。处理程序是一个函数,创建一个新范围并记住定义的值。

urls.forEach(function(url /* element */, i /* index */) {
   var page = new WebPage(url);

   page.onLoadStarted = function() {
       loading[i]= true;
       console.log('Loading started');
   };    
   pages[i]=page;
}) 

【讨论】:

  • 是的,我最终明白了这一点,但为什么我的第二次尝试(代码)效果不佳?我不使用任何索引;但链接到它自己作为属性的对象,后来当我检查该属性的所有页面时,同样的东西只有一个被定义并具有真正的价值。我真的很想明白这一点。
【解决方案2】:

试试这个代码 (es6)

    let pages = Array();
    urls.map((url,i) =>{
     let page = new WebPage(urls[i]);

     page.onLoadStarted(() =>{
      loading[i] = true;
      console.log('Loading started');
     })

(es5)

    var pages = Array();
    urls.map(function(url,i){
     var page = new WebPage(urls[i]);

     page.onLoadStarted(function(){
      loading[i] = true;
      console.log('Loading started');
     })

【讨论】:

  • 它不适用于let,似乎nodejs不支持它
  • 使用转译器babel-node
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2019-01-21
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多