Javascript 这与词汇范围有关
在上,Mozilla以以下方式解释了“this”引用的内容: 通常,当前范围内绑定到此的对象是 由当前函数的调用方式决定,不能通过 执行过程中的赋值,每次 函数被调用 在正常情况下,我理解Javascript 这与词汇范围有关,javascript,Javascript,在上,Mozilla以以下方式解释了“this”引用的内容: 通常,当前范围内绑定到此的对象是 由当前函数的调用方式决定,不能通过 执行过程中的赋值,每次 函数被调用 在正常情况下,我理解这个以及它的引用是如何变化的 projavascript设计模式一书介绍了以下关于词法范围的内容 JavaScript也是词汇范围的,这意味着函数在 定义它们的范围,而不是执行它们的范围 在 所以“这”取决于当前函数的调用方式,而词法作用域意味着函数在定义它们的作用域中运行 我的问题是,this是否可以成为词法
这个
以及它的引用是如何变化的
projavascript设计模式一书介绍了以下关于词法范围的内容
JavaScript也是词汇范围的,这意味着函数在
定义它们的范围,而不是执行它们的范围
在
所以“这”取决于当前函数的调用方式,而词法作用域意味着函数在定义它们的作用域中运行
我的问题是,
this
是否可以成为词法范围的一部分,如果是,我如何理解这取决于当前函数的调用方式,而词法范围将函数限制在定义它们的范围内 把它们看作是单独的关注点
- 函数的可变范围永远不会改变
的值将根据调用函数的方式而变化。给定相同的函数,不同的调用会给相同的函数赋予不同的此
this
所有调用都可以访问var foo = (function() { var bar = "bar"; return function() { console.log(bar, this); }; })(); foo(); // the default `this` var someObj = {some: "object"}; foo.call(someObj); // `this` is someObj var aDiffObj = {aDiff: "object"}; foo.apply(aDiffObj); // `this` is aDiffObj var anotherObj = {another: "object", foo:foo}; anotherObj.foo(); // `this` is anotherObj var binderObj = {binder: "object"}; var bound = foo.bind(binderObj); bound(); // `this` is binderObj new foo(); // `this` is a new object being constructed, // which has the prototype of `foo` in its prototype chain
变量,但该bar
值不同
这个
将永远不会从词法范围中获取,而是将始终根据调用分配一个值
有一个新的函数语法正在开发中,它可能会有一个词法
this
,但那是将来的某个时候。ES6 arrow函数声明语法改变了Javascript的“this”绑定规则,因此“this”总是指词法上下文,而不是根据调用函数的方式而改变
这定义了“This”的词法范围
var myFunc = () => {
// function contents here
}
上面的arrow函数声明语法将“this”绑定重新定义为“词法this”。不过,请小心,使用“this”时,代码中有两组不同的绑定规则,因此有充分的理由不要混淆这个问题。如果你能通过与.bind(这个)和好来避免它,你的状态可能会更好。别忘了
bind
!(虽然有点不同)@Ian:啊,是的,忘了那个。我会更新@@acjohnson55和新的
太多了。@acjohnson55哈哈文本复印机@伊恩,这是对你的文本的无尘室重新实现:)+1,但我会比“将它们视为单独的关注点”更进一步,范围和这是完全不同的概念。