如何在不使用全局变量的情况下从回调中获取数据?

用户名

我在下面创建了代码的简化版本。

var translation = 0;

function main() {
    // load images

    loopClosure(images);
}

function loopClosure(images) {
    // setup webgl

    function render() {
        window.requestAnimationFrame(render);

        // use translation here to update image locations
    }

    render();
}

document.addEventListener('keydown', keyboardHandler, false);

function keyboardHandler(event) {
    if (event.key == 'ArrowLeft') {
        translation--;
    }
    if (event.key == 'ArrowRight') {
        translation++;
    }
}

如何摆脱翻译全局变量?有没有一种方法可以基于事件更新变量而不使用全局变量?

man

正如Nik020指出的,您可以使用闭包。立即调用的函数表达式(IIFE)会创建一个闭包,但不必是IIFE模式。普通的命名函数会做同样的事情

function main() { 
    var translation = 0;

    function main() {
        // load images

        loopClosure(images);
    }

    function loopClosure(images) {
        // setup webgl

        function render() {
            window.requestAnimationFrame(render);

            // use translation here to update image locations
        }

        render();
    }

    document.addEventListener('keydown', keyboardHandler, false);

    function keyboardHandler(event) {
        if (event.key == 'ArrowLeft') {
            translation--;
        }
        if (event.key == 'ArrowRight') {
            translation++;
        }
    }
}

main();

IIFE模式仅表示您不必考虑名称,并且该名称不会与其他名称冲突。

您也可以绑定this

class App {
  constructor() {
    this.translation = 0;
    document.addEventListener('keydown', this.keyboardHandler.bind(this), false);
  }
  keyboardHandler(event) {
    if (event.key == 'ArrowLeft') {
        this.translation--;
    }
    if (event.key == 'ArrowRight') {
        this.translation++;
    }
  }
}

const app = new App();

您使用箭头语法(绑定时使用语法糖) this

class App {
  constructor() {
    this.translation = 0;
    document.addEventListener('keydown', (event) => {
      if (event.key == 'ArrowLeft') {
          this.translation--;
      }
      if (event.key == 'ArrowRight') {
          this.translation++;
      }
    }, false);
  }
}

const app = new App();

如果您希望能够删除侦听器,并且正在使用箭头函数或绑定,则可以将函数引用存储在变量中

class App {
  constructor() {
    this.translation = 0;
    const keyboardHandler = (event) => {
      if (event.key == 'ArrowLeft') {
          this.translation--;
      }
      if (event.key == 'ArrowRight') {
          this.translation++;
      }
    };
    document.addEventListener('keydown', keyboardHandler, false);
  }
}

const app = new App();

还有4到10种方法来绑定此和/或进行关闭

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用全局变量的情况下访问lambda中的变量?

如何在不使用全局变量的情况下从函数中添加2个列表?

如何在JavaScript中不使用全局变量的情况下进行置换对?

如何在不使用帮助程序的情况下访问Meteor模板中的全局变量?

如何在不使用全局变量的情况下重构我的工作?

如何在不使用全局变量的情况下构建该程序?

sapui5中如何在不使用窗口对象的情况下声明全局变量

R Shiny-如何在不使用全局变量的情况下动态添加到表中?

如何在不使用全局变量的情况下停止另一个函数中的setInterval

如何在不使变量在JavaScript中成为全局变量的情况下使用另一个函数中的变量?

如何在不使用全局变量的情况下与multiprocessing.Pool的工作人员共享内存?

在不使用全局变量的情况下保存函数的数据

如何在不使用Java中的全局变量的情况下在两个类之间共享变量?

如何在不使用全局的情况下更新 tkinter 应用程序中的变量?

如何在不使用“全局”的情况下更改 Python 函数中的变量

如何在不使用全局变量的情况下在函数内使用PHP类方法?

如何在不使用查询参数或全局变量的情况下在 express 中的路由之间传递值?

在不使用全局变量的情况下使用Django信号设置变量

在不使用全局变量的情况下跨多个视图控制器检查数据修改的方法?

如何在不使用提交按钮的情况下从多个下拉列表中获取数据

在不使用 Python 中的全局变量的情况下重写以下代码的替代方法是什么?

在不使用全局变量的情况下对python列表执行操作

如何在不使用回调的情况下从Mongoose取回数据?

如何在不使用全局变量的情况下将第二个向量传递给 C++ STL 中 sort() 函数的第三个参数的函数?

如何在不使用 eval() 的情况下使用回调更新函数包装中的条件?

如何在iOS中不使用AppDelegate的情况下访问全局数组

如何在python中没有全局变量的情况下安全地将代码分为函数

如何在不使用Assembly(NASM)中的变量的情况下将数据存储在内存中?

如何在不使用`if`语句的情况下获取所有Falsy变量