当我执行此代码时
f= function(){
let test= "hello";
let ret={
"test": "world",
"func": function(){
console.log(test);
}
}
return ret;
}
let check= f();
check.func()
我输出为“你好”。但我无法弄清楚它为什么会发生。根据我所读到的内容,范围链在定义期间相互堆叠,最后一个范围块在运行时附加在它们之上。所以范围链不应该像 - 全球 - >函数f - > ret Object - >功能测试 ?为什么ret对象的成员被排除在范围链之外?它是否像对象的成员没有附加到范围,只是上下文的一部分?
答案 0 :(得分:0)
console.log(this.test)
或console.log(ret.test)
应将输出设为“世界”。
正如@deceze所说,您必须了解this.test
和test
之间的区别。
this.test
是对象的属性,test
是某个变量,而不是对象的属性。
答案 1 :(得分:0)
问题太愚蠢而且已经有了答案,但我仍然想解释我做错了什么,对像我这样的初学者有所帮助。
实际上我正在读的文章是关于术语背景和范围以同样的方式。我试图将对象成员附加到作用域堆栈上,但这不会发生。从根本上说,范围是基于功能的,而上下文是基于对象的。每次调用都有范围和上下文,但它们不相同。因此,this.test将提供“world”,因为上下文设置为ret对象,而ret.test提供“world”,因为javascript解析了循环依赖本身。
故事的道德范围和背景不一样。不要互换使用它。
This
如果有人像我一样困惑,帖子很有用。