我对javascript引用有疑问。所以,如果我有这样的事情:
a = function(){console.log('a')};
a['b'] = function(){console.log('b')}
这些功能是否有某种关联?
答案 0 :(得分:3)
您只有一个变量:a
。但是,您已在函数a
上创建了一个名为b
的属性,它引用了另一个函数。
这是两个函数之间唯一的关系:一个是另一个属性引用的。除此之外,他们并不相关。
作为Unicode-art:
+−−−−−−−−−−−−−−−+ a−−−−>| (function) | +−−−−−−−−−−−−−−−+ | ...stuff... | | length: 0 | +−−−−−−−−−−−−−−−+ | b |−−−−>| (function) | +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−+ | ...stuff... | | length: 0 | +−−−−−−−−−−−−−−−+
...有两个不同的功能,这指的是窗口?
作为deceze pointed out,调用这些函数的this
值将完全取决于它们的调用方式,就像大多数JavaScript函数一样。 (绑定函数的异常,其this
的值绑定到它们)和ES2015 +箭头函数,它们关闭在this
上定义的位置。)
在松散模式下,执行a()
确实会调用第一个函数this
引用全局对象(浏览器上的窗口对象)。在严格模式下,a()
会将this
设置为undefined
来调用它。您也可以使用a.call(anyValueHere)
来调用它,this
设置为任意值(在严格模式下;在松散模式下,anyValueHere
必须是一个对象,或者您再次获得该全局对象)。如果您将a
分配给对象属性(var o = {a: a};
),请通过相同o.a()
的调用中的this
,o
进行调用。如果您执行new a
,将使用this
调用第一个函数,引用new
中的新对象。等
事实上,根据您的问题,a.b()
会使用this
调用第二个函数来引用第一个函数!
var a = function(){console.log('a')};
a['b'] = function(){console.log("this is: ", this)}; // Note change
a.b();