函数

函数如果没有返回值,会默认返回undefined,

通过new调用函数构造器,如果没有返回对象类型,将会默认返回this。

函数声明

function命令

foo();//函数前置
function foo(){}

函数表达式

foo();//TypeError: foo is not a function
var foo=function(){}

立即调用的函数表达式(IIFE)

function(){...}();// SyntaxError: Unexpected token ( 
//Javascript引擎看到function关键字之后,认为后面跟的是函数定义语句,不应该以圆括号结尾。

(function(){ /* code */ })();

var i = function(){ return 10; }();

!function(){ /* code */ }();

/*
通常情况下,只对匿名函数使用这种“立即执行的函数表达式”。它的目的有两个:一是不必为函数命名,避免了污染全局变量;二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
*/

 

Function构造函数

var add = new Function("x","y","return (x+y)");
// 相当于定义了如下函数
// function add(x, y) {
//   return (x+y);
// }

函数属性、arguments

function foo(x,y,z){
    arguments.length===2;
    arguments[0]=10//形参x在非严格模式下为10
    arguments[2]=100//z依然是undefined
    arguments.callee===foo;
}
foo(1,2);
foo.length;//3 形参个数
foo.name;//"foo"
foo.toString(();//输出函数内容

闭包

一般情况下,函数调用完成后。函数中的局部变量就可以被释放掉。

阮一峰:闭包就是能够读取其它函数内部变量的函数

function outer() {
      var localVal = 30;
      return function() {
          return localVal;
      } 
} 
var func = outer();  
func(); // 30

常见错误

 1 document.body.innerHTML = "<div id=div1>aaa</div>"
 2       + "<div id=div2>bbb</div><div id=div3>ccc</div>";
 3 
 4 for (var i = 1; i < 4; i++) {
 5       document.getElementById('div' + i).
 6           addEventListener('click', function() {
 7           alert(i); // all are 4! 
 8     });
 9 }
10 
11 for (var i = 1; i < 4; i++) { 
12     !function(i) { 
13         document.getElementById('div' + i).
14              addEventListener('click', function() {
15               alert(i); // 1, 2, 3 
16         }); 
17     }(i);  
18 }    
View Code

 

posted on 2015-11-06 23:08  cbwleft  阅读(108)  评论(0)    收藏  举报