-1

当我执行此代码时

f= function(){
  let test= "hello";
  let ret={
     "test": "world",
     "func": function(){
          console.log(test);
         }
    }
  return ret;
 }

let check= f();

check.func()

我得到输出为“你好”。但我无法弄清楚为什么会这样。根据我所阅读的内容,范围链在定义期间相互堆叠,最后一个范围块附加在它们之上的运行时。那么作用域链不应该像- global -> function f -> ret Object -> function test 吗?为什么 ret 对象的成员被排除在范围链之外?是不是对象的成员不附加到范围而只是上下文的一部分?

4

2 回答 2

0

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

于 2017-05-12T06:39:00.043 回答
0

console.log(this.test)或者console.log(ret.test)应该将输出作为“世界”。

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

this.test是对象的属性并且test是一些变量,而不是对象的属性。

于 2017-05-12T06:23:20.673 回答