gpt4 book ai didi

javascript - 是否可以更改 JavaScript 中的函数运行时范围?

转载 作者:行者123 更新时间:2023-11-30 17:17:13 26 4
gpt4 key购买 nike

我正在开发一个 JavaScript 库,而我需要相应地加载不同的模块,我使用回调来加载不同的脚本:

只需在页面中添加main脚本即可:

<script type="text/javascript" src="main.js"></script>

主要.js:

(function () {
var actionForT2 = function (fun) {
fun && fun.apply(this);
}
var loadCallback = function (name, obj) {
if (name == "t2") {
actionForT2(obj);
}
}
window.__jsload = loadCallback;
var loadJs = function (js) {
var head = document.head || document.getElementsByTagName('head')[0];
var script = document.createElement("script");
script.setAttribute("src", js);
script.setAttribute("type", "text/javascript");
head.appendChild(script);
}
loadJs("js/t2.js");
})();

t2.js:

__jsload('t2', function () {
console.info("t2 loaded");
console.info(loadJs);
})

现在 t2.js 将按预期加载。我得到了输出:

t2 loaded
ReferenceError: loadJs is not defined

也就是说,对于t2.js中定义的函数,没有访问到loadJs函数,那么我想知道是否可以更改加载函数的Runtime context ,例如,当加载的函数被调用时:

fun && fun.apply(this);

是否可以在当前匿名函数的上下文中调用fun,然后可以访问所有定义的变量,loadJs等函数有趣而不将它们导出到窗口


我之所以对这种解决方案感兴趣是因为我发现google map使用回调,例如,当使用google map v3时,以下脚本将被加载到页面:

https://maps.gstatic.com/maps-api-v3/api/js/18/3/main.js

然后将加载另一个模块map:

https://maps.gstatic.com/cat_js/maps-api-v3/api/js/18/3/{map}.js

深入代码后,我发现{map}.js可以访问main.js中定义的变量。但我找不到魔法是如何发生的。

最佳答案

Is it possible to change function runtime scope…I wonder if I can change the Runtime context of the loaded function, for example, when the loaded function is being called

没有。 Javascript 是词法范围的,因此范围完全取决于函数在代码中的创建位置,而不是它们从何处调用或如何调用

> fun && fun.apply(this);

这只会设置函数执行上下文的一个参数,即它的this 参数。

context 一词普遍存在混淆。在 ECMA-262(支持 javascript 的语言标准)中,context 专门用于 execution context ,这是 entire environment在一个函数中并包含它的 this 参数。

callapply 方法允许您指定函数的 this 的值,仅此而已,它们对函数没有其他影响执行上下文(这就是为什么 this 不应该被称为“上下文”的原因)。它们对 identifier resolution 没有任何影响,无论 this 的值或从何处调用函数,它都会根据范围进行。

您可能会发现以下文章很有趣:Identifier Resolution, Execution Contexts and scope chains .

关于javascript - 是否可以更改 JavaScript 中的函数运行时范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25880697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com