CNode

[已放弃] JS 各实现中原生有副作用方法的事务性讨论

问答
Ddou4cc发布于8 年前最后回复8 年前12 回复4421 浏览0 收藏

一楼空着。

欢迎打断我来讨论。我如果能一口气写完也不需要这样了。

查看回复

回复 (12)

D
dou4cc#1·8 年前

这篇博文所言,JS 标准库充斥着各种非原子性的、可能报错的有副作用方法,规范明确指出其无事务性,中途失败不会回滚。

D
dou4cc#2·8 年前

但规范对原生方法的定义从未考虑 edge cases,如 StackOverflow、OutOfMemory。

D
dislido#3·8 年前

正常人一般不会干出改数组元素描述符的事,所以这些方法这样实现也没什么问题。。。 点进去之前我还以为想讲Atomic。。。

D
dou4cc#4·8 年前

对于 Set 容器,因其不能用下标访问,理论上可以存放无数元素,故写出如下代码测试:

const set = new Set;
for(; ; ) set.add(Symbol());
D
dou4cc#5·8 年前

在 Chrome Canary x64 68.0.3401.0(V8 6.8.44)上,如上代码直接崩溃页面。 在 Firefox Nightly x64 61.0a1 (2018-04-21) 上,如上代码被警告、继续多次后烧光内存。

D
dou4cc#6·8 年前

为了测试 StackOverflow 是否会发生在原生方法中,有如下代码:

const set = new Set;
const fn = () => {
	try{
		return fn();
	}catch(_){}
	try{
		set.add("test");
	}catch(error){
		return error;
	}
};
fn();
D
dou4cc#7·8 年前

在 Chrome Canary x64 68.0.3401.0(V8 6.8.44)上,set.add("test")不报错,可见原生方法从调用到返回都不占用调用栈。

D
dou4cc#8·8 年前

在 Firefox Nightly x64 61.0a1 (2018-04-21) 上,set.add("test")报错,但定位在fn中,故不能得出原生方法不报 StackOverflow 的结论。

D
dou4cc#9·8 年前

在 Chrome Canary x64 68.0.3401.0(V8 6.8.44)上,放入for循环就报错了。。(看来不占用调用栈是解释器福利)图片.png

D
dou4cc#10·8 年前

我放弃讨论。

hhhh

Y
YUFENGWANG#12·8 年前
引用 FrankFang__legacy_5560108c4eb040084cfe5d2ahhhh

@FrankFang 卢本伟牛逼

参与回复
登录后即可参与回复。登录