本日在某个js交换群里看到如许一个题目:
亲们,假如我定义一个
function A() { }
能够给这个函数增加一个要领吗?比方:A.use = function() { }
我回答说“能够,js里function
是对象”,但再往深一点想,对这个题目还真有点隐约,坚决考证一下~
先说下答案:这类写法是能够的。
理论上来讲,js里function是对象,给对象增加属性是能够的。但如许的函数实行是如何的呢?两个函数有什么联络呢?
javascript
function A() { console.log('I am A'); } A.use = function () { console.log('123'); }; A(); // I am A A.use(); // 123
运转效果可知,这两个函数在运转的时刻并没有什么互相的影响,也表现了函数名就是个援用,A
和 A.use
是两个差别的援用,运转的时刻指向差别的内存地区,所以没有影响。
上面的代码改成:
javascript
var A = function() { console.log('I am A'); } A.use = function () { console.log('123'); }; A(); // I am A A.use(); // 123
用函数表达式来定义A( ),如许是否是就显著多了,或许说习气多了
上面的效果表明两个函数运转时互不影响,然则真的一点关联都没有吗?想起头几天总结的this
,就猎奇地考证了下这两个函数的this
是什么。
javascript
function A() { console.log(this); } A.use = function () { console.log(this); }; A(); // Window A.use(); // function A()
A.use()中的this是function A()
,这也相符this的运用划定规矩“
函数作为对象的要领调用时,this指向这个对象。
只不过在这里,这个对象是个函数罢了。
我在写《JavaScript原型》内里摘抄过下面这段:
在jQuery源码中,“jQuery”或许“$”,这个变量实际上是一个函数,能够用 typeof
考证一下。
console.log(typeof $); // function
console.log($.trim(" ABC ")); // ABC
验明正身!“$”的确是个函数。而常常运用的 $.trim() 也是个函数。
很显著,这就是在 $ 或许 jQuery 函数上加了一个 trim 属性,属性值是函数,作用是截取前后空格。
要习气的把js中的统统看做对象,只如果对象,就是属性的鸠合,属性是键值对的情势。
当时只是记住了能够如许写,本日算是真的邃晓了 :)