跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 问一个 ES6 作用域的问题
未分類
20 3 月 2020

问一个 ES6 作用域的问题

问一个 ES6 作用域的问题

資深大佬 : jingcoco 27

var value = 1;  var foo = {   value: 2,   bar: function () {     return this.value;   } }  //示例 1 console.log(foo.bar()); //示例 2 console.log((foo.bar)()); 

为什么这两个结果一样.老感觉第二个结果是 value=1 这个

大佬有話說 (35)

  • 資深大佬 : TabGre

    1. this 的隐式绑定
    2. this 的隐式绑定回退为默认绑定,非严格模式下 this 为 global(window)

  • 資深大佬 : salamanderMH

    foo.bar 这个属性就是一个函数,这两种写法一样的,this 还是指向 foo 的。

  • 資深大佬 : TabGre

    @TabGre LOL,忽略我的回答,我也没有完全搞明白。dog

  • 資深大佬 : daquandiao2

    ff = foo.bar

    ff()

  • 資深大佬 : YuxiangLuo

    let x = foo.bar;
    console.log(x());
    这样就是 1

    可能是因为 foo.bar 与(foo.bar)是同一个 reference,而 x 是复制的 reference

  • 資深大佬 : TabGre

    @daquandiao2 这样是不是就打印为 1 了呢?

  • 資深大佬 : amaranthf

    你这个是运算符优先级问题,不是作用域问题。

  • 資深大佬 : wunonglin

    你把
    bar: function () {
    return this.value;
    }
    换成
    bar: () => {
    return this.value;
    }
    有惊喜

  • 主 資深大佬 : jingcoco

    刚才搜索了一下 ,又晕了…
    “`
    (false|| foo.bar)()

    “`
    这样结果就是 1 了…..

  • 主 資深大佬 : jingcoco

    @wunonglin 你这个我知道为什么, 箭头函数的作用域是执行环境的.

  • 資深大佬 : iNaru

    @jingcoco 实例 2 中括号中的(foo.bar)返回的是引用,(false|| foo.bar)的则是或运算的结果

  • 資深大佬 : weikexin

    问一个 ES6 作用域的问题

    问一个 ES6 作用域的问题

  • 資深大佬 : max21

    @jingcoco false|| foo.bar 的运算结果就是 function () {return this.value;},然后执行这个函数,this 指向什么对象是再函数被调用时才确定的,这里没有使用 foo.bar 调用,所以 this 指向全局对象

  • 資深大佬 : ming61177

    看不出跟 ES6 有什么关系

  • 資深大佬 : kuanng

    有点意思。我的第一直觉也是 value=1

  • 資深大佬 : vivipure

    和作用域没关系,主要是 Reference 没变

  • 資深大佬 : TabGre

    箭头函数的 this 不是调用确定,而是 lexical 确定的把

  • 資深大佬 : DowneyLam

    跟 Reference 有关 你可以看看这篇文章 https://github.com/mqyqingfeng/Blog/issues/7

  • 資深大佬 : ironMan1995

    你這問題就和(function() {})() 與 (function(){}())有什麽區別。你這兩個實例都是作爲 foo 對象的方法調用的 this 指向 foo,想要 this 指向全局的 value,將 foo.bar 賦值給一個全局變量然後執行。var bar = foo.bar; bar(); //1 或者使用箭頭函數

  • 資深大佬 : Hoshinokozo

    结果一样不是正常的吗?这两种写法都是一个意思,结果都是调用 bar 函数,没搞懂疑惑的点在哪

  • 資深大佬 : morethansean

    @Hoshinokozo #20
    我感觉主说得够清楚了吧,主要还是没弄清楚 `(1, foo.bar)()` 和 `(foo.bar)()` 的区别。下的解释也蛮好的。

  • 資深大佬 : Hoshinokozo

    @morethansean 额,还是没看懂。。。盲猜主是没搞懂括号的作用吗?(foo.bar)()和(foo.bar())效果是一样的,JS 里括号的作用无非就是调用函数和提升优先级,并且将括号内的内容作为表达式解析,两种情况最终都是调用 bar 函数,作为 foo 的成员函数,this 自然指向 foo 了。

  • 資深大佬 : onfuns

    简单理解,谁调用则 this 就指向谁,console.log((foo.bar)())这里的(foo.bar)是对 foo.bar 没有计算过,也就是这个()其实是无效的等同于 foo.bar

  • 資深大佬 : otakustay

    和 ES6 没关系,()运算符里面只有一个东西的时候,相当于不存在

  • 主 資深大佬 : jingcoco

    @wunonglin @TabGre 嗯,我说错了.重新说一下
    “`
    const obj = {
    name: ‘Jerry’,
    greet: ()=>( {
    console.log(this.name)
    })
    }
    obj.greet.call(obj) // 箭头函数的话因为没有 this 所以 call 调用无用
    “`

  • 資深大佬 : cxe2v

    @jingcoco 箭头函数的 this 永远指向定义这个函数时它的外部环境的 this 指向的对象且不能再背更改,你这里写的 this 指向了 window,window 没有 name 属性,所以会返回空字符串

  • 資深大佬 : zhengjian

    @weikexin 第三问应该是 javascript 的语句是有返回值的,在 Console 里执行语句返回的 undefined 或其他 就是语句的返回值。赋值表达式的返回值就是赋给的值。

    (foo.bar = foo.bar)()

    相当于

    var bar = (foo.bar = foo.bar)
    bar()

    也就相当于

    var bar = foo.bar
    bar()

    this 指向 window

    (foo.bar = foo.bar)() -> 10
    之后,再
    foo.bar() -> 20

  • 資深大佬 : TabGre

    @jingcoco 箭头不是没有 this,箭头函数就绑定了词法时的 this,本来是 this 是调用时决定,箭头函数在词法时就决定了

  • 資深大佬 : hyy1995

    这种题…一般来说,都是自己编个想法来骗自己…

  • 資深大佬 : loading

    es6 居然会看到 var 。

  • 主 資深大佬 : jingcoco

    @TabGre 你说的有道理吧。。。。但是没看懂。。。从你的用词感觉是从逻辑的层次或是编译器的角度上去讲的?

  • 資深大佬 : TabGre

    @jingcoco 推荐看 You don’t know JS yet

  • 資深大佬 : rodjl

    可以看下这个 http://dmitrysoshnikov.com/ecmascript/chapter-3-this/

  • 資深大佬 : zhzbql

    关键词 Reference , Reference.base ; GetValue; [[call]], thisArgument; [[ThisMode]]

  • 資深大佬 : ssshooter

    @Hoshinokozo 这样理解确实可以
    括号只用于改变优先级没有其他任何功能,至于(false|| foo.bar)()又是 1 是`||`的锅

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具