引用和调用对象问题?

时间:2017-03-14 13:27:52

标签: javascript

我对javascript引用有疑问。所以,如果我有这样的事情:

a = function(){console.log('a')};
a['b'] = function(){console.log('b')}

这些功能是否有某种关联?

1 个答案:

答案 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()的调用中的thiso进行调用。如果您执行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();