js中函数和对象重名 该怎么解释

发布于 2022-09-01 18:56:54 字数 306 浏览 19 评论 0

遇到一段这样的代码

function require(id){
  .....
}
function other(){
   ...
}
var k='plus';
require[k]=other;

console.log(require);//输出的是function require(id){.....}

console.log(require.plus);//输出的是function other(){...}

这种情况 该怎么解释 这个require呢? 是函数呢还是普通对象呢?

我知道函数也是一种对象

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

你与清晨阳光 2022-09-08 18:56:54

简单来说就是函数具有普通对象的全部特性,你完全可以把它当做普通对象来用,但它还有自己的一些特点,例如它是可执行的、具有prototype属性等。

JS内部在执行代码时如果遇到函数调用语句,例如foo(),它会判断foo是不是可执行的,如果不是将会报错。并不是像我们在JS代码中常做的那样判断foo是否是function对象。所以函数具有普通对象没有的特性。


这里更正一下此楼评论里的一个结论:“这是因为function对象的toString()方法与普通对象的不同的缘故。”

不好意思,当时没有看清楚你的问题,console.log(require)之所以没有打印'plus',并不是toString()方法重载的问题(因为{plus:...}.toString()原本也不会打印其中的属性),而是console.log函数的实现问题。之前可能对您有误导,抱歉~~~就此更正!

忆梦 2022-09-08 18:56:54

这哪里有重名啊,一个是 require,一个是 require[k],两个是不同的对象。
require[k] 是 require 的一个属性。

require 还是一个函数,所以

typeof require === "function"
Object.prototype.toString.call(require) === "[object Function]"

require 同时也是一个对象,具有对象的属性,所以多加一个属性也很正常,就像

var a = {};
a[k] = other;

一样正常

执妄 2022-09-08 18:56:54

你先申明了require对象,再将require[k]设置为other,k是require的一个属性。

简单 2022-09-08 18:56:54

如果你能理解:

var k = 'k', obj = new Object({x: '1'}), other = function() {};
obj[k] = other;

那么你就应该能理解你问的代码,因为就相当于:

var k = 'k',
    require = new Function('id', '/* function body string */'),
    other = function() {};
require[k] = other;

所以require还是函数对象,它和其他函数对象一样,是由Function构造的,所以会有Function.prototype中的属性作为其属性。require[k] = other只是动态的给它添加了一个k的属性而已。

恰似旧人归 2022-09-08 18:56:54

函数名跟其他的对象名没有太大的区别,除了函数多了几个内部的属性存储执行环境和代码和[[isCallable]]返回值为true之外,没有任何的区别。

心房敞 2022-09-08 18:56:54

我以前问过一个类似的问题:http://segmentfault.com/q/1010000003798817,得到大神解答,这里引用一下

函数也是对象
函数也是对象
函数也是对象

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文