• 奥斯特洛夫斯基
    2019-02-28
    var a = 1;
    foo();

    在别处定义了 foo:

    var b = 2;
    function foo(){
        console.log(b); // 2
        console.log(a); // error
    }
    为什么我执行出来是undefined ,1
    展开
     8
     88
  • 钟凯
    2019-02-28
    关于this,Kyle Simpson有四条总结:
    1. 由new调用? 绑定到新创建的对象。
    2. 由call或者apply(或者bind)调用? 绑定到指定的对象。
    3. 由上下文对象调用? 绑定到那个上下文对象。
    4. 默认:在严格模式下绑定到undefined,否则绑定到全局对象。
    例外:箭头函数不适用以上四条规则,它会继承外层函数调用的 this 绑定(无论 this 绑定到什么)。
    展开
    
     54
  • Rushan-Chen
    2019-03-02
    老师写的 "在别处定义了foo" 的意思是,这句话上下两部分的代码,不在同一个文件哒~
    已经有同学贴了代码,是这样的:
    ```js
    // 这是 foo.js 文件里的代码
    var b = 2;
    module.exports = function() { // 导出function
      console.log(b);
      console.log(a);
    };
    ```
    ```js
    // 这是test.js 文件里的代码
    var foo = require("./foo.js"); // 引入function 为foo
    var a = 1;
    foo();
    // node 执行 test.js 输出:
    // -> 2
    // -> ReferenceError: a is not defined
    ```
    展开
     2
     26
  • 郭鹏飞277
    2019-02-28
    老师,这个例子中的最后一行代码o.showThis(); // global
    好像写错了,应该是C的实例o吧。

    class C {
        showThis() {
            console.log(this);
        }
    }
    var o = new C();
    var showThis = o.showThis;

    showThis(); // undefined
    o.showThis(); // global
    展开

    作者回复: 哦哦 对的对的 我改一下

    
     26
  • Thomas Cho
    2019-02-28
    我发现啊,不能只看文中代码结果,还是得自己跑一下,我看了文章后很是疑惑,跑了一下[[Environment]]下方那段代码后,打印出来的是 undefined和1。而不是2和error,不知为何
    
     12
  • 阿成
    2019-03-16
    这里先说声抱歉,之前可能误导了大家...
    这里更新一下答案😅
    @Rushan-Chen(虽然你并不能收到,希望极客时间赶紧增加@或者评论的功能,至少也展示个邮箱啊...不然找人都找不到,影响大家交流)
    --------------分割线-------------------
    文中,winter老师所说的“在别处定义”的意思,应该就是指在另一个模块中定义,即:

    在另一个模块中定义...这样引入这个模块时,b就定义且初始化了,而且在这个模块中访问不到变量a...
    // module a.js
    import {foo} from 'b.js'
    var a = 1
    foo()

    // module b.js
    var b = 2;
    export function foo () {
      console.log(b); // 2
      console.log(a); // error
    }

    其实,只要foo访问不到变量a就可以了嘛:
    var b = 2;
    function foo () {
      console.log(b); // 2
      console.log(a); // error
    }

    void function () {
        var a = 1
        foo()
    }()
    展开
    
     10
  • Tony
    2019-03-04
    晕得一塌糊涂... 结合上一章的 let var 来看, js 这门语言居然还能火成这样, 世界实在是太奇妙了😥
    
     5
  • zhangbao
    2019-02-28
    老师,您好,看完文章后,我有几个问题:

    1. 代码段

    ```
    class C {
        showThis() {
            console.log(this);
        }
    }
    var o = new C();

    o.showThis(); // 这里打印的 this 应该是 o 吗?
    ```

    2. 介绍函数时提到了“方法”,定义是“在 class 中定义的函数”。但是举代码例子时,举了对象方法的例子。方法定义成“作为属性值的函数”,是不是更贴切一点呢?

    3. 执行代码段

    ```
    var a = 1;
    foo();

    // 在别处定义了 foo:

    var b = 2;
    function foo(){
        console.log(b); // 2
        console.log(a); // error
    }
    ```

    后,控制台,打印出的 b 是 undefined,a 是 1。跟老师描述的不一样,是我理解错了吗?

    麻烦老师您解答一下,谢谢啦!
    展开
     1
     4
  • study
    2019-05-09
    @奥斯特洛夫斯基
    var和function,只是提升声明,代码提升完成是下面的代码:
    var a,b;
    function foo(){};
    a = 1;
    foo();
    b = 2;
    所以a的值为1,b为undefined
    展开
    
     3
  • Geek_376ed4
    2019-03-01
    // foo.js
    var b=2;
    module.exports = function() {
     console.log(b);//2
     console.log(a);//error

    };

    var foo = require("./foo.js");

    var a=1;

    foo();

    展开
    
     3
  • x
    2019-06-24
    es6中箭头函数是没有this的吧,所以他不能用作构造函数,他的this取决于外部环境

    作者回复: 不是“没有this”,是“使用定义时的this”。
    也不是“所以不能用作构造函数”,没有这个因果关系。

    
     2
  • jacklovepdf
    2019-06-19
    按照老师的理解,应该少了一种,类的方法也是可以加async的,亲测有效。
    
     2
  • DXYF2E
    2019-12-27
    觉得没看懂的同学,我觉得可以结合李兵老师的「浏览器工作原理与实践」中的第10、11节课一起阅读,可能理解程度会好一些
    
     1
  • 肉卷
    2019-12-26
    var a = 1;
    foo();

    在别处定义了 foo:

    var b = 2;
    function foo(){
        console.log(b); // 2
        console.log(a); // error
    }
    这个例子,改成如下例子应该更容易让人理解一些:
    var a = 1
      function test() {
        var b = 2

        test1()
      }
      function test1() {
        console.log(2, a, b);
      }
      test()
    展开
    
     1
  • Geek_fc1551
    2019-11-27
    winter老师普通函数不是方法吗?
     1
     1
  • 奋奋
    2019-10-11
    老师我这样对Reference的理解对吗???
    showThis(); // Reference中的对象是global
    (false || showThis)() // Reference由于运算而被解引用,
                                        然后触发this机制[[thisMode]]私有属性的global取值

    作者回复: 没错

    
     1
  • Mr.杨
    2019-04-04
    默认this 就是普通方法的this
    隐式this 变量接收方法后的this 会发生隐式指向错误
    显式this 对象.方法的this
    固定this call apply bind 的this
    分为四种
    
     1
  • 存
    2019-03-18
    var a = 1;
    foo();

    在别处定义了 foo:

    var b = 2;
    function foo(){
        console.log(b); // 2
        console.log(a); // error
    }
    为什么我执行出来是2,1
    展开
    
     1
  • 渭河
    2019-03-12
    var a = 1;
    foo();

    var b = 2;
    function foo(){
        console.log(b); // 2
        console.log(a); // 输出并不是老师说的error而是1
    }
    为什么存在这种情况
    展开
    
     1
  • itgou
    2019-03-09
    var a = 1;
    foo();

    在别处定义了 foo:

    var b = 2;
    function foo(){
        console.log(b); // 2
        console.log(a); // error
    }
    这段代码我在chrome上执行出来是undefined,1.
    我是写在一个js文件中,然后通过HTML的script引入,不知道老师说的在别处定义是什么意思,是写在两个js文件吗?

    如果是两个文件,HTML中引入文件的顺序不同,会有不同的结果,一种报错,一种两个值都正常打印,我都试了的,总之怎么也不会有老师说的那种结果。

    请老师看看是不是我哪里理解错了,还是老师写错了
    展开
    
     1
我们在线,来聊聊吧