当两者具有相同的名称时,javascript类方法如何知道调用函数或方法?

时间:2019-06-27 12:23:39

标签: javascript ecmascript-6

我只是在glide.js的索引文件中浏览了一些源代码,并且看到了以下代码:

 mount (extensions = {}) {
    this._e.emit('mount.before')

    if (isObject(extensions)) {
      this._c = mount(this, extensions, this._e)
    } else {
      warn('You need to provide a object on `mount()`')
    }

    this._e.emit('mount.after')

    return this
  }

因此,基本上mount (extensions = {}) {}Glide类内部的方法,而在此mount方法内部调用的mount是一个要导入的函数,如下所示:

import { mount } from './core/index'

我的问题是,由于名称相同,JavaScript如何区分递归调用mount方法或导入函数?

注意:::可以在here中找到代码。

1 个答案:

答案 0 :(得分:1)

mount (extensions = {}) {}是一种方法,因此您可以像this.mountsomeInstance.mount这样称呼它。 mount(this, extensions, this._e)是一个函数,因此您不要通过对象调用它。

如果您从es5的角度来看它,我想这可能会造成混淆,因为现在看来,定义了装载功能的同时也占用了装载功能。

在es5中,这类似于

mount = function() {};

Glide = {};
Glide.prototype.mount = function() { mount(); }

这一切都与上下文和作用域有关。如果您在类或对象上定义方法,则无法从当前上下文中调用它,例如在您的浏览器中,“全局范围”将是窗口。

var frank = () => {};

将与

相同

window.frank = () => {};

如果在函数中定义函数,则由于每个函数都在其自己的范围内运行,因此无法在外部访问这些函数。 然后还有上下文的问题,我很难解释。 因此,在您的示例中,进行递归调用将是在类本身的情况下进行this.mount()

关于css技巧的范围和上下文/闭包的一些有趣的阅读 https://css-tricks.com/javascript-scope-closures/