【问题标题】:How to access a function or variable in a script run with $.getScript如何访问使用 $.getScript 运行的脚本中的函数或变量
【发布时间】:2018-10-06 14:21:42
【问题描述】:

在使用$.getScript 运行脚本后,有什么方法可以访问其命名空间吗?由于plugin 是在全局范围内定义的,我原以为我可以运行它。

index.js

$.getScript('plugin.js').then((...result) => console.log(result));

$.getScript('plugin.js').then(plugin());

plugin.js

function plugin()
{
  console.log("plugin.js");
  return "plugin";
}

_输出__

ReferenceError: plugin is not defined
    at https://replit.org/data/web_hosting_uncache/abalter/loading-scripts-and-callbacks-1/index.js:5:25
[ 'var plugin = function()\n{\n  console.log("plugin.js");\n  return "plugin";\n}',
  'success',
  Promise {
    readyState: 4,
    getResponseHeader: [Function],
    getAllResponseHeaders: [Function],
    setRequestHeader: [Function],
    overrideMimeType: [Function],
    statusCode: [Function],
    abort: [Function],
    state: [Function],
    always: [Function],
    catch: [Function],
    pipe: [Function],
    then: [Function],
    promise: [Function],
    progress: [Function],
    done: [Function],
    fail: [Function],
    responseText: 'var plugin = function()\n{\n  console.log("plugin.js");\n  return "plugin";\n}',
    status: 200,
    statusText: 'success' } ]

https://repl.it/@abalter/loading-scripts-and-callbacks-1

【问题讨论】:

  • plugin 在使用时不在范围内。您将调用插件的结果作为参数传递给 then。这没有意义。你想要$.getScript('plugin.js').then(() => window.plugin());

标签: javascript jquery ajax promise javascript-namespaces


【解决方案1】:

问题出在这一行:

$.getScript('plugin.js').then(plugin());

then 接受 函数 作为参数,而不是 函数调用(除非所述函数调用是对返回函数的高阶函数的调用放入promise链中)

您在发出脚本请求的同时致电plugin()。您不希望这样 - 您只想在请求完成后调用 plugin。但在 getScript 运行时,plugin 尚未在窗口范围内定义。在then 内部,放置一个运行 plugin 调用一次的函数:

$.getScript('plugin.js').then(() => plugin());

【讨论】:

  • 谢谢!我仍然对接收函数作为参数感到困惑。例如,这不起作用:$.getScript('plugin.js').then(x => x());$.getScript('plugin.js').then((x) => x());
  • 数据不会自动解析为可以这样调用的单个函数 - 我认为这只是响应。但如果它已经被放入全局命名空间,你不想再次执行获取的脚本;你只想调用添加到window的对象。
【解决方案2】:

您正在立即调用函数:

$.getScript('plugin.js').then(plugin());

改成

$.getScript('plugin.js').then(_ => plugin());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2021-09-10
    • 2015-04-20
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多