-
定义函数
-
函数声明
- 示例
function functionName(){ //函数体 }; console.log(functionName.name);//functionName
- 注意:
- 在chrome,Firefox,Safari,Opera中为函数定义了一个name属性,该属性可以访问到该函数指定的名字;
- 函数声明有一个重要特征:函数声明提升(在执行代码前会先读取函数声明,在函数调用时再执行函数体)
helloWorld(); function helloWorld(){ console.log('hello'); }
-
函数表达式
- 示例
var funcName = function(){ //函数体 };
- 注意
- 函数表达式的形式类似于变量赋值,将一个函数赋值给变量funcName,这种方式创建的函数叫做匿名函数。
- 函数表达式没有函数提升。
- 当有不同条件赋值不同函数时,可使用函数表达式,先声明变量,再在条件语句将内不同函数赋值给变量。
//正确使用方式 var test; if(condition){ test = function(){ console.log('test1'); } }else{ test = function(){ console.log('test2'); } } //下面的方式错误,无效语法 if(condition){ function test (){ console.log('test1'); } }else{ function test (){ console.log('test2'); } }
-
匿名函数和闭包
-
匿名函数
- 理解匿名函数
- 创建一个函数并将它赋值给变量,这种情况下创建的这个函数就是匿名函数。
- 在匿名函数中定义的任何变量,都会在执行结束时被销毁。
- 用作块级作用域的匿名函数
- 示例
(function(){ //块级作用域 })(); //以上的代码定义并立即调用了一个匿名函数
- 理解上面代码的演变过程:
- 变量是值的另一种表现形式
var test = function(){//定义函数 //块级作用域 }; test();//调用函数
调用函数的方式是在函数名称的后面添加圆括号。
- 我们可以用实际的值替换变量。
(function(){ //块级作用域 })();
函数声明后面不能直接添加圆括号进行调用函数。我们通过用圆括号包含住函数声明的形式,将函数声明转换为函数表达式,然后在函数表达式后面添加圆括号进行函数调用。可以理解为该方法其实是第一点中的另一种形式。
- 变量是值的另一种表现形式
- 示例
- 注意
- 匿名函数的执行环境具有全局性,它的this对象通常指向window。
var name = 'the window'; var obj = { name: 'object', getName: function(){ return function(){ return this.name; }; } }; console.log(obj.getName()());//the window
- 匿名函数的执行环境具有全局性,它的this对象通常指向window。
-
闭包
- 理解闭包
- 闭包是指有权访问另一个函数作用域中的变量的函数。
- 注意
- 闭包只能取得包含函数中任何变量的最后一个值。
function test(){ var result = new Array(); for(var i = 0; i < 10; i++){ result[i] = function(){ return i;//全部返回10 }; } return result; }; //返回0-9的正确使用方式 function test(){ var result = new Array(); for(var i = 0; i < 10; i++){ result[i] = (function(num){ return function(){ return num; }; })(i); } return result; };
- 闭包只能取得包含函数中任何变量的最后一个值。