代码之家  ›  专栏  ›  技术社区  ›  volna

绑定导入的函数上下文

  •  0
  • volna  · 技术社区  · 6 年前

    考虑到下面的示例,是否有一种有效的方法将函数绑定到正在执行的任何上下文?

    // External.js
    function onInput () {
      console.log(data)
    }
    
    
    // Index.js
    import { onInput } from 'external.js'
    
    const data = 1
    const input = document.querySelector(`input`)
    input.addEventListener(`input`, onInput)
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Felix Kling    6 年前

    javascript具有词汇范围,而不是动态范围。这是不可能的。

    你可以定义 data 在这样的范围内 onInput 可以访问并提供更改 数据 ,例如

    // External.js
    let data;
    
    export function setData(v) {
      data = v;
    }
    
    export function onInput () {
      console.log(data)
    }
    
    // Index.js
    import { onInput, setData } from 'external.js'
    
    setData(1);
    const input = document.querySelector(`input`)
    input.addEventListener(`input`, onInput)
    

    其他选项:

    使值成为函数的参数。这可能是更传统的方式:

    // External.js
    export function onInput (data) {
      console.log(data)
    }
    
    // Index.js
    import { onInput } from 'external.js'
    
    const data = 1;
    const input = document.querySelector(`input`)
    input.addEventListener(`input`, () => onInput(data))
    

    制作 数据 函数本身的属性:

    // External.js
    export function onInput (data) {
      console.log(onInput.data)
    }
    
    // Index.js
    import { onInput } from 'external.js'
    
    onInput.data = 1;
    const input = document.querySelector(`input`)
    input.addEventListener(`input`, onInput)