10 09/2014

javascript function 的那些事

最后更新: Wed Sep 10 2014 12:37:50 GMT+0800

有三种办法定义函数

  • 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?

说法一

  1. 实时的定义,执行的时候,func1 还是 undefined(is defined at run-time)
  2. 脚本块的解析时间(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.

  1. 函数表达式(function expressions) 是顺序执行。
  2. 函数定义(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’