谈谈JavaScript中function多重明白

JavaScript 中的 function 有多重意义。它多是一个组织器(constructor),承担起对象模板的作用; 多是对象的要领(method),担任向对象发送音讯。还多是函数,没错是函数,和对象没有任何关系自力存在的能够被挪用的函数。

因为言语设计者的让步,在 JavaScript 加入了一些 class 相干的特征,以使 JavaScript 看起来确实象 Java,能够 “面向对象”。虽然 JavaScript 增加了 new 和 this, 但却没有 class (ES已加)。末了 function 暂时担当起 class 的使命。

语义1:作为组织器的 function

/**

*

  • @class Tab
  • @param nav {string} 页签题目的class
  • @param content {string} 页面内容的class

*
*/
function Tab(nav, content) {
this.nav = nav;
this.content = content;
}
Tab.prototype.getNav = function() {
return this.nav;
};
Tab.prototype.setNav = function(nav) {
this.nav = nav;
};
Tab.prototype.add = function() {
};
// 建立对象
var tab = new Tab(‘tab-nav’, ‘tab-content’);
这里定义了一个类 Tab,建立了一个对象 tab。以上使用了 function ,this, new。this, new 是罕见的面向对象言语中的关键字, 这里的 function 则担当传统面向对象言语中的 class 作用。固然这时候标识符的定名平常遵照 “首字母大写” 划定规矩。
语义2:作为对象要领的 function

因为 JavaScript 中无需类也能够直接建立对象,因此有两种体式格局给对象增加要领。第一种先定义类,要领挂在原型上,如上例的 Tab,原型上有 getNav、setNav 和 add 要领。以下另有一种,直接在 function 内的 this 上增加要领。

function Tab(nav, content) {
this.nav = nav
this.content = content
this.getNav = function() {

// ...

}
this.setNav = function() {

// ...

}
this.add = function() {

// ...

}
}

这里 Tab 是语义, this.getNav/this.setNav/this.add 是语义,作为对象的要领。 别的,能够直接定义对象及其要领

var tab = {
nav: ”,
content: ”,
getNav: function() {

// ...

},
setNav: function() {

// ...

},
add: function() {

// ...

}
}

tab.getNav/tab.setNav/tab.add 是语义,作为对象 tab 的要领。
语义3:作为自力的函数
?

/*

  • 推断对象是不是是一个空对象
  • @param obj {Object}
  • @return {boolean}

*/
function isEmpty(obj) {
for (var a in obj) {

return false

}
return true
}
// 定义一个模块
~function() {
// 辅佐函数
function now() {

return (new Date).getTime()

}
// 模块逻辑…
}();
// 采纳CommonJS范例的体式格局定义一个模块
define(require, exports, moduel) {
// 辅佐函数
function now() {

return (new Date).getTime()

}
// 模块逻辑…
})
isEmpty 作为一个全局函数存在,模块定义内里的 now 则作为部分函数存在,不管 isEmpty 照样 now 这里的 function 都指函数,它不依靠与对象和类,能够自力被挪用。
语义4:匿名函数定义模块

// 全局定名空间
var RUI = {}
// ajax.js
~function(R) {
// 辅佐函数…
ajax = {

request: function() {
  // ...
}
getJSON: function() {
  // ...
}
...

}
// 暴露出模块给 R
R.ajax = ajax
}(RUI);
// event.js
~function(R) {
// 辅佐函数…
// 事宜模块定义…
// 暴露出模块给 R
R.event = event
}(RUI);
// dom.js
~function(R) {
// 辅佐函数…
// DON模块定义…
// 暴露出模块给 R
R.dom = dom
}(RUI);
这里的匿名函数实行后把API对象暴露给了RUI,不管匿名函数内干了若干活,对应匿名函数外是看不到的,也是没有必要去剖析的。终究体贴的是公然的 API 要领,只需相识这些要领的参数及意义就能够立时使用它了。

语义5:匿名函数处置惩罚某些特殊效果如处置惩罚一些数据又不想暴露过量的变量

// 推断IE版本的hack体式格局
var IEVersion = function() {
var undef, v =
var div = document.createElement(‘div’)
var all = div.getElementsByTagName(‘i’)
while (

div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[]

);
return v > ? v : undef
}();
终究只需一个效果 IEVersion,匿名函数内部用到了一些部分变量悉数能够隔脱离。这类体式格局关于一些暂时性的数据加工异常有用,紧凑。

    原文作者:yang
    原文地址: https://segmentfault.com/a/1190000018804799
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞