💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] > JavaScript函数其三:分组中的函数表达式 **函数表达式和函数声明**: ~~~ function foo(){} // 声明,因为它是程序的一部分 var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分 ~~~ **函数声明会在代码块中被提到最前面**,而表达式不会。 ~~~ alert(fn()); function fn() { return 'Hello world!'; } ~~~ `()`是一个**分组操作符**,它的内部只能包含表达式,在使用`eval`对 JSON 进行执行的时候,JSON 字符串通常被包含在一个圆括号里`eval('(' + json + ')')`,这样做的原因就是因为分组操作符,也就是这对括号,会让解析器强制将JSON 的花括号解析成表达式而不是代码块。 **Module模式** ~~~ var Calculator = function (eq) { //这里可以声明私有成员 var eqCtl = document.getElementById(eq); return { // 暴露公开的成员 add: function (x, y) { var val = x + y; eqCtl.innerHTML = val; } }; }; var calculator = new Calculator('eq'); calculator.add(2, 2); ~~~ 每次用的时候都要 new 一下,也就是说每个实例在内存里都是一份copy。 **匿名闭包** ~~~ (function () { // ... 所有的变量和function都在这里声明,并且作用域也只能在这个匿名闭包里 // ...但是这里的代码依然可以访问外部全局的对象 }()); ~~~ 对 module 进行扩展,添加新的属性: ~~~ var module = (function(mod){ mod.moreFunc = function(){}; ... return mod })(module || (module = {})) ~~~ 若module已经存在,那么添加新的功能,若不存在,初始化为空对象再添加功能。 **克隆** ~~~ for (key in old) { if (old.hasOwnProperty(key)) { my[key] = old[key]; } } ~~~ **function的执行** 在`function`后面加个`()`就能执行一个方法,但是有一个需要注意的地方: ``` function(){}() ``` 该句会报错,原因是方法是声明式,所以不会生成一个有名字的对象来供`()`调用,但是用`()`包围起来当作表达式就可以了: ``` (function(){})() ```