是否可以在JavaScript中更改函数运行时范围
Is it possible to change function runtime scope in JavaScript?
我正在开发JavaScript库,同时需要相应地加载不同的模块,我使用回调来加载不同的脚本:
只需在页面中添加main
脚本:
<script type="text/javascript" src="main.js"></script>
main.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
函数,那么我想知道是否可以更改加载函数的运行时上下文,例如,当调用加载函数时:
fun && fun.apply(this);
是否可以在当前匿名函数的上下文下调用fun
,然后fun
可以访问所有定义的变量、函数,如loadJs
等,而无需将其导出到window
?
我之所以对这种解决方案感兴趣,是因为我发现谷歌地图使用回调,例如,当使用谷歌地图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
中定义的变量。但我找不到魔法是如何发生的。
是否可以更改函数运行时范围…我想知道是否可以更改加载函数的运行时上下文,例如,当加载函数被调用时
没有。Javascript的作用域是词法上的,因此作用域完全取决于函数在代码中的创建位置,而不是从哪里调用函数或如何调用函数
> fun && fun.apply(this);
这将只设置函数执行上下文的一个参数,即this参数。
术语上下文普遍存在混淆。在ECMA-262(javascript基础语言的标准)中,上下文仅在执行上下文中使用,该上下文是函数内部的整个环境,并包括其this参数。
调用和apply方法允许您指定函数的this的值,仅此而已,它们对执行上下文没有其他影响(这就是为什么this永远不应该被称为"上下文")。它们对标识符解析没有任何影响,标识符解析基于范围进行,无论this的值是多少,或者函数是从哪里调用的。
您可能会发现以下文章正在插入:标识符解析、执行上下文和范围链。
您可以将其设置为全局。既然你已经有window.__jsload
了,你可以把它附在那里。
__jsload.loadJs = loadJs;
// // access like this :
// console.info(__jsload.loadJS);
或者,当您从__jsload
调用它时,您可以将它传递给回调。
__jsload('t2', function (loadJs) {
console.info("t2 loaded");
console.info(loadJs);
}
- 在函数运行时显示对话
- Javascript - 加载函数运行时未定义的变量
- 运行时不存在Javascript函数
- 如何使用仅在运行时已知的变量名称调用 JavaScript 函数
- 在运行时将代码插入函数体
- 在运行时用JavaScript设置函数的名称
- 在javascript中,无法在运行时获取按钮的onClick事件的函数
- 是否有一个Javascript函数可以使代码在运行时延迟
- 如何在运行时访问typescript类公共属性(调试)?只有构造函数和函数是可访问的
- 在函数声明而不是运行时分析所有变量
- 为什么我的 init() 函数没有运行?(安装 Firefox 扩展时自动添加工具栏按钮,但仅在首次运行时)
- JS用字符串调用函数运行时内的函数
- 函数运行时的暂停事件
- 是否可以在JavaScript中更改函数运行时范围
- 如何防止脚本函数运行时,需要一个文件在Node.js
- 当我的Javascript函数运行时,我的a帧没有渲染.我怎么能让它同时渲染
- 当函数运行时.周五给我看,但基本上是周三给我看
- 更好的编码,每次函数运行时进行检查
- 如何解除绑定或防止在函数运行时发生其他单击事件
- 每次jQuery函数运行时重置变量值