标签:javascript this lexical-scope
我无法确定哪个概念解释了为什么对象的属性“count”的值保留在下面的代码中的原因.
我已阅读并回顾了Getify You Don’t Know JS的这个和对象原型部分
以及他们的部分解释lexical this.
但是,我无法理解下面的代码.这是词汇范围吗?
或者它是一个允许计数值保留的绑定?
以下是示例代码:
var obj = {
count: 0,
method: function() {
console.log("in method: " + this.count)
return this.count++;
},
timeOutMethod: function() { // I understand here we explicitly bind this, no problem here
setTimeout(function() {
console.log(this.count++)
}.bind(this), 100)
}
}
// here is where I have issue, when the method is invoked as a function
for (var i = 0; i<10; i++) {
console.log(obj.method()) // invoked as a function
}
// I've left this small block in for convenience
// I have no trouble with understanding why this block outputs what it outputs
for (var i = 0; i<10; i++) {
console.log(obj.method) // "gets its value (a reference to a function) and then logs that" from TJ Crowder
}
我希望第一个方法的输出调用obj.method()来输出
// 0
// in method 0
// 1
// in method 1
// 2
.
.
.
// 10
// in method 10
我输出的内容没问题.我的问题是,它是词汇范围吗?
或者它是一个允许计数值保留的绑定?
感谢您抽出宝贵时间提供帮助.
编辑1
在下面的Tj Crowder的帖子的帮助下,我编辑了代码片段以清除错误,因为它减损了我的问题.
解决方法:
它具有约束力.
范围是可以访问哪些变量以及语言隐藏哪些变量的概念.在机器语言中,所有内存地址都是可读写的,因此在机器语言和一些汇编语言中,范围的概念不存在(所有变量基本上都是全局的).后来的语言引入了函数,引入了全局变量和局部变量的概念.这个概念进一步演变为闭包 – 创建多个范围实例的能力.
绑定是属性/属性属于哪个对象的概念.在Java和C等实现早期绑定的语言中,绑定的概念仅仅控制方法访问属性的方式(通常这允许语言不需要“this”关键字).后期绑定语言的规则稍微复杂一些,因为绑定是在运行时而不是编译时确定的. Javascript不仅是后期绑定,而且是动态的 – 允许程序员使用Function.prototype.call()之类的东西来改变这一点.并在运行时将一个对象的方法分配给另一个对象(例如,b.foo = a.foo)
标签:javascript,this,lexical-scope 来源: https://codeday.me/bug/20190622/1261365.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。