10
09/2014
javascript function 的那些事
有三种办法定义函数
- function declaration (function statement) 函数声明
- function expression (function operator) 函数表达式
- function constructor 函数构造器
函数声明(function declarations)和函数表达式(function expressions)
对比这两段代码(function 定义)1 报错;2可以。
// 错误
func1();
var func1 = function() {
console.log(1);
}
// 正确 func2(); function func2() { console.log(1); }
Why?
说法一
- 实时的定义,执行的时候,func1 还是 undefined(is defined at run-time)
- 脚本块的解析时间(is defined at parse-time for a script block)
说法二
function declarations loads before any code is executed.While function expressions loads only when the interpreter reaches that line of code.
- 函数表达式(function expressions) 是顺序执行。
- 函数定义(function declarations)在代码执行前处理;
函数构造器(Function constructor)
There is one more way which uses a direct call to Function constructor. It takes arguments list and body as strings and creates a function from them:
函数构造器,,参数和主体都是字符串。(古老的用法)
var a=new Function('b,c','console.log(b,c)'); a(123,456)
或者
var b=new Function('j','k','console.log(j*k)'); b(4,6)
命名的函数表达式(Named function expressions)
函数表达式 经常也被叫做 匿名函数,但其实可以命名。(ie 9以下不行!)
(a=function b(c){ console.log(c,b) })('a='); console.log(b);
b 作用域在函数内部,外面没有 b
以下代码返回 true
(a=function b(c){ console.log(a===b); })();
再看例子
( function g() { return 1 } ) alert(g)
SyntaxError: Unexpected identifier g 不存在!注意:多了对括号,就不是 函数定义 了,而是 函数表达式 了。而 g 只存在于函数内部。
函数那些事
- 命名尽量用动词,如 get,read 等
- 短的名字 要么在 特定范围内;要么,全局(如 $ $$ $x)
- 一个“不返回值”的函数,其实返回了 ‘undefined’