EloquentJavaScript - 通过此关键字引用无效?

时间:2017-09-14 20:43:06

标签: javascript this

我想确定,http://eloquentjavascript.net/10_modules.html,例如:



    (function(exports) {
      var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
                   "Thursday", "Friday", "Saturday"];

      exports.name = function(number) {
        return names[number];
      };
      exports.number = function(name) {
        return names.indexOf(name);
      };
    })(this.weekDay = {});

    console.log(weekDay.name(weekDay.number("Saturday")));
    // → weekDay not defined

当我在提到的网站上运行它时,它可以工作,但是当我尝试在vs代码(+ node.js to debug)中执行相同操作时,它表示weekDay未定义。我已经弄清楚了,原因是这个关键字没有引用包含整个代码的对象,但是它指的是持有调用该函数的对象的对象,所以我试过这个:  

(function(exports) {
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
                 "Thursday", "Friday", "Saturday"];

    exports.name = function(number) {
      return names[number];
    };
    exports.number = function(name) {
      return names.indexOf(name);
    };
  })(weekDay = {});

  console.log(weekDay.name(weekDay.number("Saturday")));
// → Saturday

(function(exports) { var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; exports.name = function(number) { return names[number]; }; exports.number = function(name) { return names.indexOf(name); }; })(weekDay = {}); console.log(weekDay.name(weekDay.number("Saturday"))); // → Saturday

它有效,任何人都可以解释为什么? IMO传递的参数不被视为函数变量,而是属于调用函数的对象的变量(但是为什么书中的代码可以在网站上运行呢?)。

1 个答案:

答案 0 :(得分:1)

首先,不要对不理解this感到不舒服。这令人困惑。

这总结this非常好:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch1.md#review-tldr

道德感谢凯尔。

我的TL; DR:您在节点中调用的this绑定到文件中运行的代码。您在浏览器中调用的this绑定到window对象,该对象是浏览器中可用的特殊对象,超级用户从过去的岁月中遗留下来。 ;)

记住this是一个绑定,在调用函数时产生,它引用的内容完全取决于调用函数的调用站点。

在示例沙箱中(从浏览器的全局范围调用),this引用浏览器的window对象。 window是浏览器的全局对象。它包含所有全局变量。您的呼叫站点是全球范围。

用最简单的术语来说,每个节点文件都在自己的泡泡中运行。每个文件都有自己的this,呼叫网站就是泡泡。全局范围中的变量不会自动挂在节点模块中的this下。

再插一下:阅读凯尔的书。去上课吧。他是一位了不起的老师。