Javascript对象中的范围

时间:2017-05-12 06:15:48

标签: javascript scope-chain

当我执行此代码时

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对象的成员被排除在范围链之外?它是否像对象的成员没有附加到范围,只是上下文的一部分?

2 个答案:

答案 0 :(得分:0)

console.log(this.test)console.log(ret.test)应将输出设为“世界”。

正如@deceze所说,您必须了解this.testtest之间的区别。

this.test是对象的属性,test是某个变量,而不是对象的属性。

答案 1 :(得分:0)

问题太愚蠢而且已经有了答案,但我仍然想解释我做错了什么,对像我这样的初学者有所帮助。
实际上我正在读的文章是关于术语背景和范围以同样的方式。我试图将对象成员附加到作用域堆栈上,但这不会发生。从根本上说,范围是基于功能的,而上下文是基于对象的。每次调用都有范围和上下文,但它们不相同。因此,this.test将提供“world”,因为上下文设置为ret对象,而ret.test提供“world”,因为javascript解析了循环依赖本身。
故事的道德范围和背景不一样。不要互换使用它。
This 如果有人像我一样困惑,帖子很有用。