思维扭曲暗示了这一点.var访问
Mind twisting implied this.var access
x = {}
function f1 () {
this.v1 = 'cool'
try { console.log('v1:', v1) } catch(e){ console.log('error') }
}
f1.bind(x)()
f1()
f1.bind(x)()
f1()
输出:error
v1: cool
v1: cool
v1: cool
请解释为什么这段代码只打印一次error
,然后再打印cool
。
为什么v1
没有this
就能工作?
第二次调用没有bind()
的f1()
(其中this
隐式地是window
),将全局变量v1
(或window.v1
)赋值给'cool'
,这是随后打印的值。
有趣的问题
为什么不用这个关键字就可以使用v1 ?
因为你的"this"关键字将被绑定到"window"对象,这是特殊的。在window的情况下,变量对象与它的this对象/上下文相同。
简单地说,窗口对象上的变量和属性是一回事。
下面是ECMA-262的一个例子。
var a = new String('test');
alert(a); // directly, is found in VO(globalContext): "test"
alert(window['a']); // indirectly via global === VO(globalContext): "test"
alert(a === this.a); // true
var aKey = 'a';
alert(window[aKey]); // indirectly, with dynamic property name: "test"
首先,您记录的不是this.v1
,而是v1
。这是对v1
全局变量的引用,该变量应该在window
上定义。每次你记录的不是x.v1
,而是window.v1
。
this
在没有限定作用域的函数中引用全局window
。所以当你第一次调用它时,v1
是在x
上创建的,但是当你第二次调用它时,它是在window
上创建的。
相关文章:
- 如何做到这一点,使代码在不传递条件后执行函数
- gmap3如何做到这一点-它显示圆圈的任何事件
- 硒元素在这一点上是不可点击的
- JQuery是否有一个“;移动“;作用或者有没有一种更紧凑的方法来做到这一点
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- AngularJS:有没有比指定的方法更好的方法来实现这一点
- Mootorial在这一点上有多重要或过时
- Javascript递归函数引用了这一点
- 我想听听服务器上的更改,并相应地更新我的网页.我如何用Javascript做到这一点
- JavaScriptEs6在内部函数中引用了这一点
- js并在加载前编辑url-如何做到这一点
- 角度缩小2-有人成功做到这一点吗
- Javascript OOP-在异步回调中丢失了这一点
- 谷歌地图与方向 - 我可以在没有表单标签的情况下做到这一点吗?
- config.fullPage = true;在 ckEditor 内联模式下无法正常工作.如何实现这一点
- window.btoa( // here programcode // ) 如何做到这一点
- 如何在Jquery中实现这一点?(JS到Jquery)
- 如何优化这一点
- 我将如何做到这一点
- 思维扭曲暗示了这一点.var访问