【问题标题】:what scope does a function set to let have?函数设置让有什么范围?
【发布时间】:2015-01-15 02:01:32
【问题描述】:

let 与 var 相比,其作用域比 var 更紧密,但我想知道它是否会改变匿名函数的作用域?

例子:

class Foo {
    method1() {
        var scopelessFunc = this.method2;

        // executed in global scope
        scopelessFunc();

        let differentScope = this.method2;

        // what scope is this executed in?  (what does method2 output)
        differentScope();
    }

    method2() {
        console.log(this);
    }
}

注意:据我所知,截至今天 1 月 14 日, let 在任何地方都没有得到完全支持,所以我不能自己去测试。

【问题讨论】:

  • let 仅声明变量可见的位置。不多也不少。
  • this 仍然是全局对象,它与词法范围无关。 this 将取决于您如何调用该函数。
  • this 取决于您调用函数的方式,而不是调用函数的位置。它总是在当前执行上下文中解析(除了 ES6 中的箭头函数,它使用外部上下文的 this)。
  • 不,调用函数的作用域从不影响执行函数本身的作用域。
  • 谢谢!酷,我今天学到了一些东西!如果你们中的一个人将此作为答案发布,我可以接受,否则我将删除该问题。

标签: javascript scope ecmascript-6


【解决方案1】:

您混淆了两个彼此无关的概念。通过letvar 的变量范围只会影响这些变量的可见性。魔术关键字this 是一个完全独立的机制。 this 所指的内容取决于函数的调用方式。 scopelessFunc()differentScope() 调用函数的方式完全相同,所以没有区别。如果你想有所作为,你需要改变你称呼他们的方式:

someObj.scopelessFunc()
scopelessFunc.apply(someObj)

这是影响this 的唯一因素,而someObjscopelessFunc 是否通过varlet 定义无关紧要。

【讨论】:

    猜你喜欢
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多