js中函数和对象重名 该怎么解释
遇到一段这样的代码
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
简单来说就是函数具有普通对象的全部特性,你完全可以把它当做普通对象来用,但它还有自己的一些特点,例如它是可执行的、具有
prototype
属性等。JS
内部在执行代码时如果遇到函数调用语句,例如foo()
,它会判断foo
是不是可执行的,如果不是将会报错。并不是像我们在JS
代码中常做的那样判断foo
是否是function
对象。所以函数具有普通对象没有的特性。这里更正一下此楼评论里的一个结论:“这是因为
function
对象的toString()
方法与普通对象的不同的缘故。”不好意思,当时没有看清楚你的问题,
console.log(require)
之所以没有打印'plus',并不是toString()
方法重载的问题(因为{plus:...}.toString()
原本也不会打印其中的属性),而是console.log
函数的实现问题。之前可能对您有误导,抱歉~~~就此更正!这哪里有重名啊,一个是 require,一个是 require[k],两个是不同的对象。
require[k] 是 require 的一个属性。
require 还是一个函数,所以
require 同时也是一个对象,具有对象的属性,所以多加一个属性也很正常,就像
一样正常
你先申明了
require
对象,再将require[k]设置为other,k是require的一个属性。如果你能理解:
那么你就应该能理解你问的代码,因为就相当于:
所以require还是函数对象,它和其他函数对象一样,是由Function构造的,所以会有Function.prototype中的属性作为其属性。require[k] = other只是动态的给它添加了一个k的属性而已。
函数名跟其他的对象名没有太大的区别,除了函数多了几个内部的属性存储执行环境和代码和
[[isCallable]]
返回值为true
之外,没有任何的区别。我以前问过一个类似的问题:http://segmentfault.com/q/1010000003798817,得到大神解答,这里引用一下