sách gpt4 ai đã đi

javascript - 使用 JSON 解析/解析 js 对象时,返回方法中的函数范围会丢失

In lại 作者:行者123 更新时间:2023-12-03 11:53:28 28 4
mua khóa gpt4 Nike

我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习:

(function (global) {
// our module number one
var body = function () {
var someVar = 'some test text';
trở lại {
method: function () {
return someVar; // this will undefined when call this method in second module
}
};
};
var f = new Function([' return (', body, ')();'].join(''));
global.r = f();
})(window);

(function (global) {
// our module two
var body = function () {
// dep variable is injected on the fly with `new Function`
dep.method(); // will throw `Reference Error: someVar is not defined`
};

// helper to propertly transform functions in JSON.stringify
function transformFuncs (key, val) {
if (typeof val === 'function') {
return val.toString().replace(/(\t|\n|\r)/gm, '').replace(/("|')/gm, '\\"');
}
return val;
}
// injecting our first module inside
var vars = ['var ', 'dep', ' = JSON.parse(\'', JSON.stringify(global.r, transformFuncs), '\', function (key, value) { if (value && typeof value === "string" && value.substr(0,8) == "function") { var startBody = value.indexOf("{") + 1; var endBody = value.lastIndexOf("}"); var startArgs = value.indexOf("(") + 1; var endArgs = value.indexOf(")"); return new Function(value.substring(startArgs, endArgs), value.substring(startBody, endBody)); } return value; });'].join('');
// as variable
var f2 = new Function([vars, ' return (', body, ')();'].join(''));
global.r2 = f2();
})(window);

如果您在某个地方运行此代码,您会看到抛出异常 ReferenceError: someVar is not Defined.

所以基本上这里发生了什么 - 我们创建一些模块,然后尝试将其作为变量注入(inject)另一个模块中。 JSON.parse 中用于正确获取字符串化函数的函数如下所示(如果您好奇的话):

function (key, value) { 
if (value && typeof value === "string" && value.substr(0,8) == "function") {
var startBody = value.indexOf("{") + 1;
var endBody = value.lastIndexOf("}");
var startArgs = value.indexOf("(") + 1;
var endArgs = value.indexOf(")");
return new Function(value.substring(startArgs, endArgs), value.substring(startBody, endBody));
}
return value;
}

那么..问题是否有可能解决这种作用域行为?据我了解, global.r 在一个作用域中分配了 f 结果,但具有 phương pháp 函数的结果对象没有保存变量实例,因为 while为该函数创建 JSON 解析另一个作用域。

Bạn có ý tưởng nào không?

P.S. 请不要问我为什么需要这个:) 只是考虑可能的解决方案。 主要思想是以某种方式注入(inject)第一个模块(查看顶部thân hình var)作为第二个模块内的变量(thân hình 第二个函数的 var)保存返回方法的原始范围.

Cảm ơn!

1 Câu trả lời

is it possible to workaround such scope behavior?

没有。作用域无法从外部访问,并且它们在函数序列化时必然会丢失。您只能对不引用任何自由变量的“纯”函数(如 thân hình)进行字符串化。

这也是 JSON 格式不包含函数的原因。

The main idea is to somehow inject module number one as variable inside second module saving the original scope of methods that are returned.

插入引用,而不是字符串。依赖注入(inject)并不神奇,各种 JavaScript 模块加载器都可以做到这一点。

关于javascript - 使用 JSON 解析/解析 js 对象时,返回方法中的函数范围会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25711565/

28 4 0
Bài viết được đề xuất: javascript - ember 转换 ajax 查询字符串
Bài viết được đề xuất: mercurial - 如何删除TortoiseHg中的意外分支?
Bài viết được đề xuất: grails - Grails应用程序的探查器
Bài viết được đề xuất: javascript - 如何选择第一个li
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com